21

我需要从应用程序接收图像,我能想到的最好方法是将其发送到以 Base64 编码的 JSON 数组中。图像非常小,所以我不在乎额外的开销。

我有一个模型:

class Observation(models.Model):    
    ...
    sonogram_image = models.ImageField(upload_to=sonogram_dir)

及其序列化器:

class ObsvSerializerNoDetect(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = Observation

我应该把解码图像的代码放在哪里?

4

3 回答 3

23

这是在基于 Django(也称为 drf)的 API 端的发布请求中处理 Base64 编码图像文件的方法,该 API 将其保存为 ImageField。

假设您有一个模型,如下所示:

Class MyImageModel(models.Model):
      image = models.ImageField(upload_to = 'geo_entity_pic')
      data=model.CharField()

所以对应的序列化器如下:

 from drf_extra_fields.fields import Base64ImageField

 Class MyImageModelSerializer(serializers.ModelSerializers):
      image=Base64ImageField() # From DRF Extra Fields
      class Meta:
         model=MyImageModel
         fields= ('data','image')
      def create(self, validated_data):
        image=validated_data.pop('image')
        data=validated_data.pop('data')
       return MyImageModel.objects.create(data=data,image=image)

对应的View可以如下:

elif request.method == 'POST':
    serializer = MyImageModelSerializer(data=request.data)
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data, status=201)
    return Response(serializer.errors, status=400)

注意在序列化器中,我使用了模块django-extra-field中提供的 Base64ImageField 的实现

要安装此模块,请运行命令

pip install django-extra-fields

导入相同的并完成!

发送(通过 post 方法)您的图像作为 JSON 对象中的 Base64 编码字符串以及您拥有的任何其他数据。

于 2017-03-09T14:22:02.643 回答
2

试试django extra fields。假设您当然在模型中使用Base64ImageField了 an ,则用作序列化器字段。ImageField

于 2014-10-26T19:09:02.673 回答
2

根据您的用例,可能有两个最佳位置:

  1. 在您的序列化程序中,您可以为您的字段覆盖validate_X和方法(请参阅验证文档)以及此处的双向转换。transform_X

  2. 如果您更频繁地需要该功能,请编写您自己的自定义字段。您只需在 和 中定义转换如何在两个方向上to_native运行from_native。也许扩展原始 DRFImageField以使用 PIL 保持图像数据验证。

更新 DRF3:

transform_X方法替换为to_representation(). 请参阅removing-of-transform_field_name覆盖序列化和反序列化行为

也看看这个 DRF Base64ImageFieldMixin例子。

于 2014-03-13T08:33:47.837 回答