【问题标题】:Django Rest Framework Optional Image field is not workingDjango Rest Framework 可选图像字段不起作用
【发布时间】:2020-11-23 11:28:30
【问题描述】:

我正在尝试在序列化程序中将图像字段设为可选。但它仍然没有使图像字段成为可选的。我的代码如下:

图片上传文件管理类:

class FileManager:
       @staticmethod
       def photo_path(instance, filename):
           basefilename, file_extension = os.path.splitext(filename)
           date = datetime.datetime.today()
           uid = uuid.uuid4()
           if isinstance(instance, User):
               return f'profile_pic/{instance.email}/{uid}-{date}{file_extension}'
           elif isinstance(instance, BlogPost):
              print(file_extension)
              return f'blog_pic/{instance.author.email}/{uid}-{date}{file_extension}'

我的模型类:

class BlogPost(models.Model):
'''
Manage Blog Posts of the user
'''
author = models.ForeignKey(get_user_model(), 
            on_delete=models.DO_NOTHING, 
            related_name='blog_author')

content = models.TextField(max_length=600, blank=True, null=True)
content_image = models.FileField(upload_to= FileManager.photo_path, null=True, blank=True)
is_approved = models.BooleanField(default=False)

updated_on = models.DateTimeField(auto_now_add=True)
timestamp = models.DateTimeField(auto_now_add=True)

def save(self, *args, **kwargs):
    super(BlogPost, self).save(*args, **kwargs)
    img = Image.open(self.content_image.path)
    if img.height > 600 or img.width > 450:
        output_size = (600, 450)
        img.thumbnail(output_size)
        img.save(self.content_image.path)

我的序列化程序类:

class BlogPostUserSerializer(serializers.HyperlinkedModelSerializer):
'''
Will be serializing blog data
'''
author = UserListSerializer(read_only=True)
content = serializers.CharField(required=False)
content_image = serializers.ImageField(required=False, max_length=None, allow_empty_file=True, use_url=True)

class Meta:
    model = BlogPost
    fields = (  
                'url',
                'id', 
                'content', 
                'content_image', 
                'author')

def validate(self, data):
    if not data.get('content') and not data.get('content_image'):
        raise serializers.ValidationError({'message':'No-content or Content image were provided'})
    return data

错误文本:

/forum/write-blog 处的 ValueError

“content_image”属性没有与之关联的文件。

我已经浏览了 Django Rest Framework 的 Doc,但没有任何帮助。甚至其他人的answers 也无法正常工作,请帮帮我。

【问题讨论】:

    标签: django django-rest-framework django-serializer


    【解决方案1】:

    其实我已经解决了这个问题。现在我看到它从来没有来自我的序列化程序类。

    事实上,它来自我的模型类的 Save 方法。它试图在保存时修改图像,但由于模型字段为空,它会引发错误。我解决的代码。

    class BlogPost(models.Model):
    '''
    Manage Blog Posts of the user
    '''
    author = models.ForeignKey(get_user_model(), 
                on_delete=models.DO_NOTHING, 
                related_name='blog_author')
    
    content = models.TextField(max_length=600, blank=True, null=True)
    content_image = models.FileField(upload_to= FileManager.photo_path, null=True, blank=True)
    is_approved = models.BooleanField(default=False)
    
    updated_on = models.DateTimeField(auto_now_add=True)
    timestamp = models.DateTimeField(auto_now_add=True)
    
    def save(self, *args, **kwargs):
        super(BlogPost, self).save(*args, **kwargs)
        if self.content_image:
            img = Image.open(self.content_image.path)
            if img.height > 600 or img.width > 450:
                output_size = (600, 450)
                img.thumbnail(output_size)
                img.save(self.content_image.path)
    
    class Meta:
        unique_together = ( 'author', 
                            'content', 
                            'content_image')
    

    这里我添加了一个条件,如果有图像然后修改它。

            if self.content_image:
            img = Image.open(self.content_image.path)
    

    【讨论】:

      【解决方案2】:

      尝试这样做

      class BlogPostUserSerializer(serializers.HyperlinkedModelSerializer):
      '''
      Will be serializing blog data
      '''
         author = UserListSerializer(read_only=True)
      
         class Meta:
             model = BlogPost
             fields = (  
                      'url',
                      'id', 
                      'content', 
                      'content_image', 
                      'author')
      
             read_only_fields = ['id',]
         def validate(self, data):
            if data.get('content') is None and data.get('content_image') is None:
                raise serializers.ValidationError({'message':'No-content or Content image were provided'})
            return data
      

      【讨论】:

        猜你喜欢
        • 2013-07-07
        • 2019-09-15
        • 1970-01-01
        • 2013-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-03
        相关资源
        最近更新 更多