django rest framework:从序列化器validate()方法设置字段级错误

问题描述 投票:26回答:4

我有一个序列化程序,根据其他字段的值验证字段,在错误响应中,我想将每个字段错误显示为字段错误,而不是显示“non_field_errors”下的所有内容,如果我要提高的话会发生什么对象级验证方法中的ValidationError。下面是我想要实现的目标的说明:

MySerializer(ModelSerializer):
    ...
    def validate(self, data):
        field_val1 = data['field_val1']
        field_val2 = data['field_val2']
        if not self._is_field_valid(field_val1, field_val2):
            # The below line is how I would do what I want with Django
            # Forms, however, it's not valid in DRF
            self._errors['field_val1'] = 'this field is not valid'

所需的错误响应是:

{'field_val1': ['this field is not valid']}
django django-rest-framework serializer
4个回答
48
投票

我想通了,在“BaseSerializer”部分的文档的this页面上,有一个示例显示ValidationError可以在初始化时获取字典参数。

如果我raise ValidationError({'field_val1': ['this field is not valid']})我得到我想要的JSON响应。


1
投票

与@ Jkk.jonah的答案类似,这会引发一个ValidationError,但它会重用原始的异常文本而无需重新实现翻译:

try:
    serializer.fields['field_val1'].fail('required')
except ValidationError as exc:
    raise ValidationError({
        'field_val1': exc.detail,
    })

默认情况下(即在rest_framework.fields.Field类上),可用的键是:

default_error_messages = {
    'required': _('This field is required.'),
    'null': _('This field may not be null.')
}

子类可以在那里添加自己的错误消息(并且SerializerField的子类)。

顺便说一句,新的错误消息将自动与现有(继承)消息合并 - 不会像预期的那样被覆盖。


0
投票

如果您具有适用于所有字段的逻辑,则仍可通过执行以下操作获得所需的结果:

def validate(self, data):
    for key, value in data.items():
        # checks if value is empty
        if not value:
            raise serializers.ValidationError({key: "This field should not be left empty."})

    return data

0
投票

如果您在DRF中使用内置验证器(实际上是django核心验证器),则必须预处理来自验证器的django ValidationError,其功能为get_error_detail drf用于此目的。

def _validate_min_value(self, data, key):
        try:
            MinValueValidator(Decimal('0.01'))(data.get(key))
        except ValidationErrorDjango as exc:
            raise ValidationError(
                {key: get_error_detail(exc)}
            )

请注意,ValidationErrorDjango是来自django.core.exceptions的ValidationError,而ValidationError是来自rest_framework.exceptions的ValidationError

© www.soinside.com 2019 - 2024. All rights reserved.