django rest framework:从序列化程序 validate() 方法设置字段级错误
django rest framework: set field-level error from serializer validate() method
我有一个序列化程序,它根据其他字段的值验证字段,在错误响应中,我想将每个字段错误显示为字段错误,而不是显示 "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']}
我想通了,在 "BaseSerializer" 部分文档的 this 页上,有一个示例显示 ValidationError 可以在初始化时采用字典参数。
如果我 raise ValidationError({'field_val1': ['this field is not valid']})
我会得到我想要的 JSON 响应。
与@Jkk.jonah 的回答类似,这引发了一个 ValidationError
,但它重用了原始异常文本而无需重新实现翻译:
try:
serializer.fields['field_val1'].fail('required')
except ValidationError as exc:
raise ValidationError({
'field_val1': exc.detail,
})
默认情况下(即 rest_framework.fields.Field
class),可用键为:
default_error_messages = {
'required': _('This field is required.'),
'null': _('This field may not be null.')
}
Subclasses 可以在其中添加自己的错误消息(Serializer
是 Field
的子class)。
顺便说一句,新的错误消息将自动与现有(继承的)消息合并 - 不会像预期的那样被覆盖。
如果您有适用于所有字段的逻辑,您仍然可以通过这样做获得所需的结果:
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
如果您在 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
的一个
我有一个序列化程序,它根据其他字段的值验证字段,在错误响应中,我想将每个字段错误显示为字段错误,而不是显示 "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']}
我想通了,在 "BaseSerializer" 部分文档的 this 页上,有一个示例显示 ValidationError 可以在初始化时采用字典参数。
如果我 raise ValidationError({'field_val1': ['this field is not valid']})
我会得到我想要的 JSON 响应。
与@Jkk.jonah 的回答类似,这引发了一个 ValidationError
,但它重用了原始异常文本而无需重新实现翻译:
try:
serializer.fields['field_val1'].fail('required')
except ValidationError as exc:
raise ValidationError({
'field_val1': exc.detail,
})
默认情况下(即 rest_framework.fields.Field
class),可用键为:
default_error_messages = {
'required': _('This field is required.'),
'null': _('This field may not be null.')
}
Subclasses 可以在其中添加自己的错误消息(Serializer
是 Field
的子class)。
顺便说一句,新的错误消息将自动与现有(继承的)消息合并 - 不会像预期的那样被覆盖。
如果您有适用于所有字段的逻辑,您仍然可以通过这样做获得所需的结果:
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
如果您在 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