情况
在Django REST框架中使用验证时ModelSerializer,我注意到这些Meta.model字段总是经过验证,即使这样做不一定有意义.以下示例为User模型的序列化:
password领域和一个confirm_password领域.如果两个字段不匹配,则无法创建用户.同样,如果请求username已存在,则无法创建用户.validate在串行的情况下(见下文),捕不匹配password和confirm_password领域执行validate:
def validate(self, data):
if data['password'] != data.pop('confirm_password'):
raise serializers.ValidationError("Passwords do not match")
return data
Run Code Online (Sandbox Code Playgroud)
问题
即使ValidationError被引发validate,ModelSerializer仍然会查询数据库以检查它username是否已被使用.这在从端点返回的错误列表中很明显; 存在模型和非字段错误.
因此,我想知道如何在非字段验证完成之前阻止模型验证,从而节省了对数据库的调用.
尝试解决方案
我一直试图通过DRF的来源找出这种情况发生的地方,但是我找不到我需要覆盖的内容以使其工作失败.
这是我的serializers.py(我想为内置的User模型创建一个序列化器):
from rest_framework import serializers
from django.contrib.auth.models import User
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('username', 'password', 'email', )
Run Code Online (Sandbox Code Playgroud)
我知道Django Rest Framework有它自己的字段验证器,因为当我尝试使用已经存在的用户名创建用户时,它会引发一个错误:
{'username': [u'This field must be unique.']}
Run Code Online (Sandbox Code Playgroud)
我想自定义错误消息并让它说"此用户名已被占用.请再试一次"而不是说"此字段必须是唯一的".
它还有一个内置的正则表达式验证器,因为当我创建带有感叹号的用户名时,它会说:
{'username': [u'Enter a valid username. This value may contain only letters, numbers and @/./+/-/_ characters.']}
Run Code Online (Sandbox Code Playgroud)
我想自定义正则表达式验证器,以便它只是说"无效的用户名".
如何自定义每个字段的所有错误消息?
注意:根据这篇文章:Django Rest Framework序列化程序中的自定义错误消息我可以这样做:
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
def __init__(self, *args, **kwargs):
super(UserSerializer, self).__init__(*args, **kwargs)
self.fields['username'].error_messages['required'] = u'My custom required msg'
Run Code Online (Sandbox Code Playgroud)
但是我如何为"独特"和"正则表达式"验证器做些什么呢?我试过了
self.fields['username'].error_messages['regex'] = u'My custom …Run Code Online (Sandbox Code Playgroud) django validation error-handling django-serializer django-rest-framework