序列化二进制字段djangorest框架

mre*_*art 5 base64 serialization django-rest-framework

我在通过序列化器保存 Base64 字符串时遇到困难。我正在使用 django 休息框架 2.4 和 django 1.7。模型和序列化器如下:

模型.py

class TicketAttachmentAreas(models.Model):
    id = models.AutoField(primary_key=True)
    ticket = models.ForeignKey(Tickets)
    attachment_file = models.ForeignKey(AttachmentFiles, related_name='areas')
    x1 = models.IntegerField(blank=True, null=True)
    x2 = models.IntegerField(blank=True, null=True)
    y1 = models.IntegerField(blank=True, null=True)
    y2 = models.IntegerField(blank=True, null=True)
    paint_data = models.BinaryField(blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)

序列化器.py

class TicketAttachmentAreasSerializer(serializers.HyperlinkedModelSerializer):
    ticket = serializers.PrimaryKeyRelatedField()
    attachment_file = serializers.PrimaryKeyRelatedField()

    class Meta:
        model = TicketAttachmentAreas
        fields = ('url', 'id', 'x1', 'y1', 'x2', 'y2', 'ticket', 'paint_data', 'attachment_file')
Run Code Online (Sandbox Code Playgroud)

我只是尝试使用以下代码通过序列化器保存数据:

serializer = TicketAttachmentAreasSerializer(data=data)
if serializer.is_valid():
    serializer.save()
Run Code Online (Sandbox Code Playgroud)

不幸的是,即使我在 data['paint_data'] 中有我的 base64,serializer.data['paint_data'] 是空的,因此没有保存。

我猜测 DRF modelSerializer 无法识别 BinaryField,并且需要像 serializers.BinaryField 这样的东西,或者使用 methodField 来设置它,但我对它很陌生,目前不知道如何正确执行此操作,所以我'非常感谢您的帮助!

(目前我正在使用以下解决方法,但它很丑陋:)

if serializer.is_valid():
    ticket_attachment_area = serializer.save()
    if 'paint_data' in data.keys():
        ticket_attachment_area.paint_data = base64.encodestring(data['paint_data'])
        ticket_attachment_area.save()
Run Code Online (Sandbox Code Playgroud)

Jkk*_*nah 2

考虑编写自定义序列化器字段并在序列化器中使用它。您可以指定字符串和字节之间的转换方式。

  • 如果有一个开箱即用的解决方案就好了。 (2认同)