情况
在Django REST Framework的验证中工作时ModelSerializer,我注意到Meta.model字段总是被验证,即使这样做不一定有意义。以以下示例进行User模型的序列化:
ModelSerializer
Meta.model
User
password
confirm_password
username
validate
实施validate:
def validate(self, data): if data['password'] != data.pop('confirm_password'): raise serializers.ValidationError("Passwords do not match") return data
问题
即使ValidationError通过引发了validate,ModelSerializer仍然会查询数据库以查看username是否已在使用。从端点返回的错误列表中可以明显看出这一点。模型和非现场误差都存在。
ValidationError
因此,我想知道如何在非现场验证完成之前阻止模型验证,从而节省了对数据库的调用。
尝试解决
我一直在尝试通过DRF的源来找出发生这种情况的位置,但是我未能成功找到需要覆盖的内容才能使它起作用。
由于您的username字段很可能已unique=True设置,因此Django REST框架会自动添加一个验证程序,该验证程序将检查以确保新用户名是唯一的。实际上,您可以通过进行确认repr(serializer()),这将向您显示所有自动生成的字段,其中包括验证程序。
unique=True
repr(serializer())
验证按特定的,未记录的顺序运行
serializer.to_internal_value
field.run_validators
serializer.validate_[field]
serializer.run_validation
serializer.run_validators
serializer.validate
因此,您看到的问题是在序列化程序级别的验证之前调用了字段级别的验证。尽管我不建议这样做,但是您可以通过extra_kwargs在serilalizer的meta中进行设置来删除字段级验证器。
extra_kwargs
class Meta: extra_kwargs = { "username": { "validators": [], }, }
但是,您将需要unique在自己的验证中重新执行检查,以及自动生成的任何其他验证器。
unique