我有一个像这样的序列化器:
class ContactSerializer(serializers.ModelSerializer):
class Meta:
model = Contact
fields = (
'account', 'first_name', 'last_name', 'email',
'phone_number',
)
validators = [
UniqueTogetherValidator(
queryset=Contact.objects.all(),
fields=['account', 'phone_number'],
message='A contact with this phone number is already exists.',
),
]
API 将唯一的一起验证器错误返回为
non_field_errors
我想在特定领域展示它。在这种情况下
phone_number
我该怎么办?
可以通过继承
UniqueTogetherValidator
并覆盖
__call__
方法来实现此目的。以下是如何修改代码以在
phone_number
字段中显示错误消息:
from rest_framework import serializers
from rest_framework.validators import UniqueTogetherValidator
class CustomUniqueTogetherValidator(UniqueTogetherValidator):
def __call__(self, attrs, serializer):
try:
super().__call__(attrs, serializer)
except serializers.ValidationError as e:
# 获取验证错误的字段列表
error_fields = list(e.detail.keys())
# 如果 'phone_number' 在错误字段中,则将其移至 'phone_number' 字段
if 'non_field_errors' in error_fields and 'phone_number' in self.fields:
e.detail['phone_number'] = e.detail.pop('non_field_errors')
raise e
class ContactSerializer(serializers.ModelSerializer):
class Meta:
model = Contact
fields = (
'account', 'first_name', 'last_name', 'email',
'phone_number',
)
validators = [
CustomUniqueTogetherValidator(
queryset=Contact.objects.all(),
fields=['account', 'phone_number'],
message='A contact with this phone number already exists.',
),
]
在这个修改后的代码中:
-
我们创建了一个名为
CustomUniqueTogetherValidator
的自定义验证器,它继承自UniqueTogetherValidator
。 -
我们覆盖了
__call__
方法。在这个方法中,我们首先调用父类的__call__
方法来执行实际的验证。 -
如果验证失败并引发
ValidationError
,我们会检查错误消息是否包含non_field_errors
键以及phone_number
是否是我们验证器中指定的字段之一。 -
如果这两个条件都为真,我们从
non_field_errors
键中获取错误消息,将其添加到phone_number
键下,然后删除non_field_errors
键。
通过这种方式,可以将
UniqueTogetherValidator
错误消息显示为
phone_number
字段中的字段错误,而不是
non_field_errors
中的非字段错误。