Python Django:转到Serializer.py后未保存文件

Python Django:转到Serializer.py后未保存文件,python,django,serialization,Python,Django,Serialization,我正在发送一个base64编码的图像。我已经为ImageField创建了一个自定义序列化器字段来处理base64编码。我现在可以确定在执行序列化程序之前,在执行post请求时如何保存图像 下面是我的serializers.py代码 from rest_framework import serializers from .models import Photo import base64 from django.core.files.base import ContentFile from res

我正在发送一个base64编码的图像。我已经为ImageField创建了一个自定义序列化器字段来处理base64编码。我现在可以确定在执行序列化程序之前,在执行post请求时如何保存图像

下面是我的serializers.py代码

from rest_framework import serializers
from .models import Photo
import base64
from django.core.files.base import ContentFile
from rest_framework import serializers
import pdb; 

class PhotoSerializer(serializers.ModelSerializer):

    image = serializers.ImageField('from_native')
    class Meta:
       model = Photo
       fields = ('photoname', 'image')


    def from_native(self, data):
       if isinstance(data, basestring) and data.startswith('data:image'):
        # base64 encoded image - decode
           format, imgstr = data.split(';base64,')
           print(imgstr)# format ~= data:image/X,
           ext = format.split('/')[-1]  # guess file extension
           data = ContentFile(base64.b64decode(imgstr), name='temp.' + ext)

     return super(Base64ImageField, self).from_native(data)

相应的序列化程序如下所示:

from rest_framework import serializers
from .models import Photo     

class Base64ImageField(serializers.ImageField):

    def to_internal_value(self, data):
        from django.core.files.base import ContentFile
        import base64
        import six
        import uuid

        if isinstance(data, six.string_types):
            if 'data:' in data and ';base64,' in data:
                header, data = data.split(';base64,')

            try:
                decoded_file = base64.b64decode(data)
            except TypeError:
                self.fail('invalid_image')

            file_name = str(uuid.uuid4())[:12] # 12 characters are more than enough.
            file_extension = self.get_file_extension(file_name, decoded_file)
            complete_file_name = "%s.%s" % (file_name, file_extension, )
            data = ContentFile(decoded_file, name=complete_file_name)

        return super(Base64ImageField, self).to_internal_value(data)

    def get_file_extension(self, file_name, decoded_file):
        import imghdr

        extension = imghdr.what(file_name, decoded_file)
        extension = "jpg" if extension == "jpeg" else extension

        return extension

class PhotoSerializer(serializers.ModelSerializer):
    image = Base64ImageField(max_length=None, use_url=True)

    class Meta:
       model = Photo
       fields = ('photoname', 'image')

相应的序列化程序如下所示:

from rest_framework import serializers
from .models import Photo     

class Base64ImageField(serializers.ImageField):

    def to_internal_value(self, data):
        from django.core.files.base import ContentFile
        import base64
        import six
        import uuid

        if isinstance(data, six.string_types):
            if 'data:' in data and ';base64,' in data:
                header, data = data.split(';base64,')

            try:
                decoded_file = base64.b64decode(data)
            except TypeError:
                self.fail('invalid_image')

            file_name = str(uuid.uuid4())[:12] # 12 characters are more than enough.
            file_extension = self.get_file_extension(file_name, decoded_file)
            complete_file_name = "%s.%s" % (file_name, file_extension, )
            data = ContentFile(decoded_file, name=complete_file_name)

        return super(Base64ImageField, self).to_internal_value(data)

    def get_file_extension(self, file_name, decoded_file):
        import imghdr

        extension = imghdr.what(file_name, decoded_file)
        extension = "jpg" if extension == "jpeg" else extension

        return extension

class PhotoSerializer(serializers.ModelSerializer):
    image = Base64ImageField(max_length=None, use_url=True)

    class Meta:
       model = Photo
       fields = ('photoname', 'image')