序列化二进制字段django rest框架

时间:2015-02-20 14:00:35

标签: serialization base64 django-rest-framework

我很难通过序列化程序保存Base64字符串。我使用django rest framework 2.4和django 1.7。模型和序列化器如下:

models.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)

serializers.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')

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

serializer = TicketAttachmentAreasSerializer(data=data)
if serializer.is_valid():
    serializer.save()

不幸的是,即使我在数据[' 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()

2 个答案:

答案 0 :(得分:2)

查看writing a custom serializer field并在序列化程序中使用它。您可以指定要在字符串和字节之间进行转换的方式。

答案 1 :(得分:0)

Django 序列化程序未获取二进制字段值。 您必须在序列化程序中声明 Charfield。

TicketAttachmentAreasSerializer(serializers.HyperlinkedModelSerializer):
    ticket = serializers.PrimaryKeyRelatedField()
    attachment_file = serializers.PrimaryKeyRelatedField()
    **paint_data = serializers.CharField()**