序列化二进制字段 django rest framework
Serialize binary field 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()
查看 writing a custom serializer field 并在您的序列化程序中使用它。您可以指定字符串和字节之间的转换方式。
Django 序列化程序未获取二进制字段值。
您必须在序列化程序中声明 Charfield。
TicketAttachmentAreasSerializer(serializers.HyperlinkedModelSerializer):
ticket = serializers.PrimaryKeyRelatedField()
attachment_file = serializers.PrimaryKeyRelatedField()
**paint_data = serializers.CharField()**
我在通过序列化程序保存 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()
查看 writing a custom serializer field 并在您的序列化程序中使用它。您可以指定字符串和字节之间的转换方式。
Django 序列化程序未获取二进制字段值。 您必须在序列化程序中声明 Charfield。
TicketAttachmentAreasSerializer(serializers.HyperlinkedModelSerializer):
ticket = serializers.PrimaryKeyRelatedField()
attachment_file = serializers.PrimaryKeyRelatedField()
**paint_data = serializers.CharField()**