为啥模型字段验证发生在 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> 被调用之前?的主要内容,如果未能解决你的问题,请参考以下文章