在 django 中验证通过 post 请求传递的图像文件的问题

Issues in validating Image file passed through post request in django

我想在我的 Django 项目中验证两件事:

  1. 传递的图像是否有效(具有适当的扩展名、非空等)

  2. 我有一个函数 isCovering70p,它 returns bool,取决于图像中的对象是否覆盖了 70% 的区域。 现在我必须在将数据保存到数据库之前也检查一下。如果用户发布的图像未通过这 2 个中的任何一个,则应发送 400 响应代码。

这是我的 models.py:

def user_image_dir_path(instance, filename):
    return f"uploads/users/{instance.email}/{filename}"


class UserDetail(models.Model):

    email = models.EmailField(max_length=80)
    registration_time = models.DateTimeField(auto_now_add=True)
    image_path = models.ImageField(upload_to=user_image_dir_path)
    image_meta = models.CharField(max_length=100)

    @property
    def filename(self):
        return os.path.basename(self.file.name)

这是我的 serializers.py:

class UserDetailsSerializer(serializers.ModelSerializer):

    class Meta:
        model = UserDetail
        fields = ['full_name', 'email', 'org_id', 'image_path']

DRF docs,我知道我的 #1 验证条件将由 DRF/django 处理。

但是,我应该如何以及在何处处理 #2 情况?

此外,我想根据 isCovering70p 更新我的 image_meta 字段。我应该如何以及在哪里放置该更新的逻辑?

解决此问题的一种方法是使用序列化程序上的验证方法

class UserDetailsSerializer(serializers.ModelSerializer):
    
    class Meta:
        model = UserDetail
        fields = ['full_name', 'email', 'org_id', 'image_path']  
    
    def validate(self, data):
        if not isCovering70p(data['image_path']):
            raise serializers.ValidationError({'image_path': 'image is not covering 70% of area')
        return data

您可以只向序列化程序添加一个验证函数,并在收到的数据无效时引发 ValidationError。