该场景非常简单:
我有一个带有某些必填字段的模型。假设其中一个是TextField不能的blank。我也有一个ModelSerializer代表该模型的(Django Rest Framework)。
TextField
blank
ModelSerializer
当使用空字符串通过序列化程序设置该字段时,返回的错误来自模型本身(This field can't be blank)。
This field can't be blank
我想仅在序列化程序级别覆盖错误消息,而无需显式重新指定序列化程序中的每个字段(我认为这违反了DRY原理),而必须validate_为每个字段编写一个方法并引发自己的问题ValidationError或必须在Model级别中更改错误消息(因为有时错误消息的上下文对于我的用例很重要,因此应该相应地给出错误消息)。
validate_
Model
换句话说,有没有办法像在serializer级别那样简单地覆盖串行器级别的错误消息ModelForm:
serializer
class MyModelForm(ModelForm): class Meta: model = MyModel error_messages = {"field1": {"required": _("For some reason this is a custom error message overriding the model's default")}}
这个问题仍然有一些看法,因此必须注意还有另一种方法,它比我在此处发布的原始答案要干净得多。
你可以只使用序列化程序的Meta类的extra_kwargs属性,如下所示:
class UserSerializer(ModelSerializer): class Meta: model = User extra_kwargs = {"username": {"error_messages": {"required": "Give yourself a username"}}}
原始答案:
使用@mariodev的答案,我在项目中创建了一个新类,该类可以执行以下操作:
from rest_framework.serializers import ModelSerializer, ModelSerializerOptions class CustomErrorMessagesModelSerializerOptions(ModelSerializerOptions): """ Meta class options for CustomErrorMessagesModelSerializerOptions """ def __init__(self, meta): super(CustomErrorMessagesModelSerializerOptions, self).__init__(meta) self.error_messages = getattr(meta, 'error_messages', {}) class CustomErrorMessagesModelSerializer(ModelSerializer): _options_class = CustomErrorMessagesModelSerializerOptions def __init__(self, *args, **kwargs): super(CustomErrorMessagesModelSerializer, self).__init__(*args, **kwargs) # Run through all error messages provided in the Meta class and update for field_name, err_dict in self.opts.error_messages.iteritems(): self.fields[field_name].error_messages.update(err_dict)
第一个可以Meta像一样向序列化器添加新的class属性ModelForm。第二个继承自ModelSerializer@mariodev的技术并使用它来更新错误消息。
ModelForm
剩下要做的就是继承它,然后做类似的事情:
class UserSerializer(CustomErrorMessagesModelSerializer): class Meta: model = User error_messages = {"username": {"required": "Give yourself a username"}}