Django Rest Framework自定义验证错误

Dar*_*ger 6 validation field django-rest-framework

我正在尝试为帐户模型自定义DRF(3.x)的默认验证错误.我的目标是编写验证函数,以便发回自定义的错误消息.

我尝试过以下方法:

class AccountSerializer(serializers.ModelSerializer):
    password = serializers.CharField(write_only=True, required=False)

    class Meta:
        model = Account
        fields = ('id', 'email', 'password',)

    def validate_password(self, value):
        """
        Validate Password.
        """
        if not value:
            raise serializers.ValidationError("Password cannot be empty!")
        elif len(value) < 5:
            raise serializers.ValidationError("Password to short...")
        return value
Run Code Online (Sandbox Code Playgroud)

长度验证工作正常,但'密码为空'验证永远不会被抛出,因为之前抛出了默认错误('密码',[这个字段可能不是空白.']).

是否有任何选项可以禁用默认错误或首先强制通过我的自定义函数进行验证?

感谢帮助!

Kev*_*own 6

您可以通过设置覆盖在每场为基础的验证错误error_messages参数初始化场时.您需要传递一个字典,其中键是错误消息名称,值是错误消息的自定义文本.

在您的情况下,您正在寻找实现两个错误消息:requiredmin_length.您可能还需要覆盖blank,这会触发您当前的错误,除非您allow_blank=True在该字段上设置.

因此,通过这些更改,您的序列化程序将变为

class AccountSerializer(serializers.ModelSerializer):
    password = serializers.CharField(
        write_only=True,
        required=False,
        min_length=5,
        error_messages={
            "blank": "Password cannot be empty.",
            "min_length": "Password too short.",
        },
    )

    class Meta:
        model = Account
        fields = ('id', 'email', 'password', )
Run Code Online (Sandbox Code Playgroud)

len用密码字段中min_length参数替换了您的支票.

这将您的所有验证卸载到Django REST框架,这将使升级更容易.validate_password如果你需要额外的自定义验证,你仍然可以覆盖,但是现在我已经删除它,因为它是空的.


Dar*_*ger 5

找到了解决办法:

我必须使用 to_internal_value 函数验证这些值,因为验证是按特定顺序运行的(感谢 Kevin Brown): 验证顺序

现在我改进后的代码如下:

class AccountSerializer(serializers.ModelSerializer):
    password = serializers.CharField(write_only=True, required=False)

    class Meta:
        model = Account
        fields = ('id', 'email', 'password',)

    def to_internal_value(self, data):
        password = data.get('password')
        """
        Validate Password.
        """
        if not password:
            raise serializers.ValidationError({'password': 'Password cannot be empty!'})
        elif len(password) < 5:
            raise serializers.ValidationError({'password': 'Password to short...'})

        return {
            'password': password
        }
Run Code Online (Sandbox Code Playgroud)

我希望这篇文章对某人有用:)