当使用base64在django-rest api中保存图像时,我想将null设置为true



我的型号是:

class Profile(models.Model):
store_picture1 = models.ImageField(null=True, blank=True)
store_picture2 = models.ImageField(null=True, blank=True)
store_picture3 = models.ImageField(null=True, blank=True)
store_picture4 = models.ImageField(null=True, blank=True)
store_picture5 = models.ImageField(null=True, blank=True)
store_picture6 = models.ImageField(null=True, blank=True)
def save(self,*args, **kwargs):
if self.user_picture:
im = Image.open(self.user_picture)
output = BytesIO()
im = im.resize((740, 610))
im.save(output, format='JPEG', quality=120)
im.save(output, format='PNG', quality=120)
output.seek(0)
self.user_picture = InMemoryUploadedFile(output, 'ImageField', "%s.jpg" % 
self.user_picture.name.split('.')[0], 'image/jpeg',sys.getsizeof(output), None)
self.user_picture = InMemoryUploadedFile(output, 'ImageField', "%s.png" % 
self.user_picture.name.split('.')[0], 'image/png',sys.getsizeof(output), None)

self.user_picture = InMemoryUploadedFile(output, 'ImageField', "%s.jpg" % 
self.user_picture.name.split('.')[0], 'image/jpeg',sys.getsizeof(output), None)
self.user_picture = InMemoryUploadedFile(output, 'ImageField', "%s.png" % 
self.user_picture.name.split('.')[0], 'image/png',sys.getsizeof(output), None)

这是我的serializers.py类:

class Base64ImageField(serializers.ImageField):
def to_internal_value(self, data):
# Check if this is a base64 string
if isinstance(data, six.string_types):
# Check if the base64 string is in the "data:" format
if 'data:' in data and ';base64,' in data:
# Break out the header from the base64 content
header, data = data.split(';base64,')
# Try to decode the file. Return validation error if it fails.
try:
decoded_file = base64.b64decode(data)
except TypeError:
self.fail('invalid_image')
# Generate file name:
file_name = str(uuid.uuid4())[:12] # 12 characters are more than enough.
# Get the file name extension:
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):
extension = imghdr.what(file_name, decoded_file)
extension = "jpg" if extension == "jpeg" else extension
return extension

class ProfileUpateSerializer(ModelSerializer):

user_picture = Base64ImageField(
max_length=None, use_url=True,
)
store_picture1 = Base64ImageField(
max_length=None, use_url=True,
)
store_picture2 = Base64ImageField(
max_length=None, use_url=True,
)
store_picture3 = Base64ImageField(
max_length=None, use_url=True,
)
store_picture4 = Base64ImageField(
max_length=None, use_url=True,
)
store_picture5 = Base64ImageField(
max_length=None, use_url=True,
)
store_picture6 = Base64ImageField(
max_length=None, use_url=True,
)
class Meta:
model = Profile
fields ='__all__'

我确实在我的models.py中为imageField设置了null=true和blan=true,但当我想用带有api的image base64发送时,会通知它需要这个字段cat在我的序列化程序类中如何设置null和blank true

事实上,我认为我应该在serializers.py 中为类ProfileUpateSerializer添加一些内容

您可以在Base64ImageField中传递required=False。即

user_picture = Base64ImageField(
max_length=None, use_url=True, required=False
)

最新更新