【问题标题】:DRF: based on the validation of field x, stop the validation of field y and delete from dataDRF:基于字段 x 的验证,停止字段 y 的验证并从数据中删除
【发布时间】:2021-05-06 19:44:50
【问题描述】:

我有一个表单,用户可以在其中发布交易,为此他们可以选择上传图片 (x),或者提供指向互联网上已上传图片的链接 (y)。因此,当任何一个字段存在并且有效时,我想从验证中取消另一个字段。这是一个简化的模型:

class Deal(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='deals',
                            on_delete=models.CASCADE)
    title = models.CharField(max_length=1024, blank=False, null=False)
    slug = models.SlugField(max_length=1024, unique=True, blank=True)
    poster = models.ImageField()
    poster_url = models.CharField(max_length=1024, blank=True, null=True)
    created = models.DateField(auto_now_add=True)
    updated = models.DateField(auto_now=True)

这是我的序列化程序:

class DealSerializer(serializers.ModelSerializer):

    user = UserSerializer(many=False, read_only=True)

    class Meta:
        model = Deal
        fields = '__all__'

    def validate_poster_url(self, value):
        poster = self.initial_data.get("poster")
        if value == "" and poster == "":
            # set to mutable
            self.initial_data._mutable = True
            self.initial_data.delete("poster")
            raise serializers.ValidationError(
                "Deal must either have a Poster or a Poster URL")
        return value

    def validate_poster(self, value):
        poster_url = self.initial_data.get("poster_url")
        if value != "":
            if poster_url == "":
                # set to mutable
                self.initial_data._mutable = True
                self.initial_data.delete("poster_url")
                raise serializers.ValidationError(
                    "Deal must either have a Poster or a Poster URL")
        return value

    def create(self, validated_data):
        deal, _ = Deal.objects.update_or_create(**validated_data)
        return deal

当我提交例如一个 poster_url 时,poster 字段仍然得到验证,并且我收到一个验证错误:

poster: ["The submitted data was not a file. Check the encoding type on the form."]

我曾尝试从 initial_data 中“删除”必填字段,但这不起作用,我还尝试使用全局 validate(),但从未调用过它。我真的很感激任何帮助。谢谢。

【问题讨论】:

    标签: python django validation django-rest-framework


    【解决方案1】:

    好吧,Deal.poster 不是可选的,所以这就是 Django 抱怨的原因。我认为您无法在序列化程序级别处理此问题。看看Django - how to make ImageField/FileField optional?

    【讨论】:

    • 伙计,我怎么会这么瞎。有时需要从外面看一看。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-28
    • 2021-07-30
    • 1970-01-01
    • 2011-08-27
    相关资源
    最近更新 更多