我想发出 POST 请求来创建机器人并传递多个经过 Base64 编码的 photo_examples 图像。默认情况下,使用Base64图像字段时,只能添加一张图像,但我需要添加几张。我尝试查看网上的其他项目,但没有找到解决方案,请问如何实现?
模型.py
class Bot(models.Model):
"""Bot Model."""
name = models.CharField(
'Название',
max_length=100
)
author = models.ForeignKey(
User,
on_delete=models.CASCADE,
verbose_name='Автор',
)
description = models.TextField(
'Описание'
)
categories = models.ManyToManyField(
Category,
through='CategoryBot',
related_name='bots',
verbose_name='Категории',
)
main_photo = models.ImageField(
'Фото',
upload_to='uploads/main/%Y/%m/%d/',
)
price = models.DecimalField(
'Цена',
max_digits=8,
decimal_places=0
)
is_special_offer = models.BooleanField(
'Спецпредложение',
default=False
)
class Meta:
ordering = ('name',)
verbose_name = 'Бот'
verbose_name_plural = 'Боты'
def __str__(self):
return self.name
class Photo(models.Model):
"""Model of photos of examples of the bot's work."""
photo_examples = models.ImageField(
'Фото(образцы)',
upload_to='uploads/examples/%Y/%m/%d/',
)
bot = models.ForeignKey(
Bot,
on_delete=models.CASCADE,
verbose_name='Бот',
related_name='photo_examples'
)
class Meta:
ordering = ('bot',)
verbose_name = 'Фото(образцы)'
verbose_name_plural = 'Фото(образцы)'
def __str__(self):
return f' Фото бота {self.bot}'
序列化器.py
class PhotoSerializer(serializers.ModelSerializer):
"""Serializer of photo bot examples"""
photo_examples = Base64ImageField()
class Meta:
model = Photo
fields = '__all__'
class CategoryNameSerializer(serializers.PrimaryKeyRelatedField):
def to_representation(self, value):
return value.name
class AbstractBotSerializer(serializers.ModelSerializer):
"""
An abstract class that defines serialization and
deserialization behavior for bot-related data.
"""
photo_examples = PhotoSerializer(many=True)
author = serializers.StringRelatedField(read_only=True)
discount_author = serializers.SerializerMethodField()
discount_category = serializers.SerializerMethodField()
amount_discounts_sum = serializers.SerializerMethodField()
final_price = serializers.SerializerMethodField()
categories = CategoryNameSerializer(
required=False,
queryset=Category.objects.all(),
many=True,
)
class Meta:
abstract = True
fields = '__all__'
视图.py
class BotViewSet(ModelViewSet):
"""The viewset for the bot.
With the possibility of pagination, search by name
and description, filtering by category"""
queryset = Bot.objects.all()
serializer_class = BotSerializer
pagination_class = LimitPageNumberPagination
filter_backends = (filters.SearchFilter, DjangoFilterBackend, )
search_fields = ('name', 'description')
permission_classes = (IsAuthorOrReadOnly, IsAuthor,)
filterset_fields = ('categories', )
def get_serializer_class(self):
if self.action == 'retrieve':
return BotReviewRatingSerializer
return self.serializer_class
def perform_create(self, serializer):
discount_author = self.request.data.get("discount_author", 0)
bot_instance = serializer.save(author=self.request.user)
bot_discount, created = BotDiscount.objects.get_or_create(
bot=bot_instance, defaults={"discount": discount_author}
)
if not created:
bot_discount.discount = discount_author
bot_discount.save()
我想以这种格式传递数据,但是如果有一种方法可以更轻松地实现添加多个图像,那么可以使用另一种传递多个图像的方法。
发布请求
{
"name": "My Bot New",
"description": "This is my bot",
"main_photo": "data:image/jpeg;base64,/9j/4A....A/9k=",
"price": 500,
"discount_author": 35,
"categories": [6, 4],
"photo_examples": [
{
"photo_examples": "data:image/jpeg;base64,/9j/4A....A/9k="
},
{
"photo_examples": "data:image/jpeg;base64,/9j/4A....A/9k="
}
]
}
现在我收到此错误消息:
{
"photo_examples": [
{
"bot": [
"Required field"
]
},
{
"bot": [
"Required field."
]
}
]
}