首页 > 编程问答 >如何将 UniqueTogetherValidator 显示为字段错误而不是非字段错误?

如何将 UniqueTogetherValidator 显示为字段错误而不是非字段错误?

时间:2024-07-31 13:36:54浏览次数:10  
标签:python django django-models django-rest-framework django-views

我有一个像这样的序列化器:

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.',
            ),
        ]

在这个修改后的代码中:

  1. 我们创建了一个名为 CustomUniqueTogetherValidator 的自定义验证器,它继承自 UniqueTogetherValidator

  2. 我们覆盖了 __call__ 方法。在这个方法中,我们首先调用父类的 __call__ 方法来执行实际的验证。

  3. 如果验证失败并引发 ValidationError ,我们会检查错误消息是否包含 non_field_errors 键以及 phone_number 是否是我们验证器中指定的字段之一。

  4. 如果这两个条件都为真,我们从 non_field_errors 键中获取错误消息,将其添加到 phone_number 键下,然后删除 non_field_errors 键。

通过这种方式,可以将 UniqueTogetherValidator 错误消息显示为 phone_number 字段中的字段错误,而不是 non_field_errors 中的非字段错误。

标签:python,django,django-models,django-rest-framework,django-views
From: 60583013

相关文章