为啥模型字段验证发生在 validate 或 validate_<field> 被调用之前?

Posted

技术标签:

【中文标题】为啥模型字段验证发生在 validate 或 validate_<field> 被调用之前?【英文标题】:Why Model field validation happens before validate or validate_<field> is called?为什么模型字段验证发生在 validate 或 validate_<field> 被调用之前? 【发布时间】:2018-04-05 04:43:13 【问题描述】:

我刚开始学习 Django Rest Framework,我不明白为什么 DRF 在自己验证之前运行模型字段验证我有一个模型,它有一个 URLField,基本上我想添加 http:/ / 或者 https:// 在它验证之前,所以写了自定义验证方法

class ShortenerSerializer(serializers.ModelSerializer):
    class Meta:
        extra_kwargs = 
            'count': 'read_only':True
        
        fields = ('id', 'url', 'short_url', 'count', 'created_at')
        model = Shortener

    def validate_url(self, url):
        if not 'http://' in url and not 'https://' in url:
            url = 'http://' + url
        url_validate = URLValidator()
        try:
            url_validate(url)
        except:
            raise serializers.ValidationError("Please Enter a Valid URL")
        return url

我什至覆盖了 validate 方法,但是在模型字段验证之后再次调用它,因为它引发了异常。我想我需要重写一些方法,但不知道要重写哪一个。

【问题讨论】:

【参考方案1】:

你可以重写 is_valid 方法来避免这种行为

class ShortenerSerializer(serializers.ModelSerializer):
    def is_valid(self, *args, **kwargs):
        if self.initial_data.get('url'):
            # update self.initial_data with appended url

        return super(ShortenerSerializer, self).is_valid(*args, **kwargs)

【讨论】:

我得到这个 QueryDict 实例是不可变的。我这样做了。 def run_validation(self, data): url = data.get('url') if url: if not 'http://' in url and not 'https://' in url: url = 'http://' + url data['url'] = url print(data) return super().run_validation(data) 啊,明白了。编辑了我的答案以更改方法名称。 仍然获得相同的 QueryDict 实例是不可变错误。我正在这样做self.initial_data['url'] = 'http://' + self.initial_data.get('url')

以上是关于为啥模型字段验证发生在 validate 或 validate_<field> 被调用之前?的主要内容,如果未能解决你的问题,请参考以下文章

sklearn中score为啥使用测试数据

玩! 1.2.5 与 mongodb |模型验证未发生

为啥我应该使用 Validators.compose()?

django 表单验证和字段验证

使用 Hibernate Validator (JSR 303) 进行跨字段验证

为啥 jquery.validation.js 在我的项目中不起作用?