Django Rest Framework自定义验证错误

时间:2015-01-19 17:04:14

标签: 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

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

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

感谢您的帮助!

2 个答案:

答案 0 :(得分:6)

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

在您的情况下,您希望实现两条错误消息: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', )

我已在密码字段中使用the min_length argument替换了您的len支票。

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

答案 1 :(得分:1)

找到解决方案:

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

现在我的改进代码如下:

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
        }

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