Django Rest Framework Дополнительное поле изображения не работает - PullRequest
0 голосов
/ 03 августа 2020

Я пытаюсь сделать поле изображения необязательным в сериализаторе. Но это все еще не делает поле изображения необязательным. Мой код выглядит следующим образом:

Класс управления файлами загрузки фотографий:

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

Текст ошибки:

ValueError в / forum / write-blog

Атрибут content_image не имеет связанного с ним файла.

Я прошел через Django Rest Framework Do c, но без помощи. Даже ответов других не работают, пожалуйста, помогите, я застрял.

Ответы [ 2 ]

1 голос
/ 03 августа 2020

Собственно проблему решил. Теперь, когда я вижу, он никогда не исходил из моего класса сериализатора.

Фактически он исходил из метода 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)
0 голосов
/ 03 августа 2020

Попробуйте сделать так

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
...