RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1549973
Accepted
Unknown
Unknown
Asked:2023-11-06 21:13:11 +0000 UTC2023-11-06 21:13:11 +0000 UTC 2023-11-06 21:13:11 +0000 UTC

如何向请求添加多个 Base64 编码图像

  • 772

我想发出 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."
            ]
        }
    ]
}
django-rest-framework
  • 1 1 个回答
  • 25 Views

1 个回答

  • Voted
  1. Best Answer
    Unknown
    2023-11-07T02:39:13Z2023-11-07T02:39:13Z

    添加到perform_create中的views.py中:

        # извлекает данные фотографии из данных запроса
        photos_data = self.request.data.get('photo_examples', None)
        if photos_data:
            # проход по каждой фотографии
            for photo_data in photos_data:
                photo_examples_data = photo_data.get('photo_examples', None)
                if photo_examples_data:
                    # создает новый экземпляр фотографии с помощью экземпляра
                    # бота
                    photo = Photo.objects.create(bot=bot_instance)
                    #  сохраняет данные photo_examples в экземпляре Photo..
                    photo.photo_examples.save(
                        f"{photo.pk}.jpg",
                        ContentFile(base64.b64decode(
                            photo_examples_data.split(',')[1])),
                        save=True
                    )
    

    在serializers.py中我重新定义了photo_examples字段

    photo_examples = PhotoSerializer(many=True, read_only=True)
    
    • 0

相关问题

  • 在 redoc 和 swagger 中更改 API 的标头

  • 如何使内容仅对创建它的用户可见?

  • 实施电子邮件验证和密码恢复的愿景存在问题

  • 访问令牌生成

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5