当前位置: 首页 > 知识库问答 >
问题:

Django Rest框架序列化程序中的自定义错误消息

曹普松
2023-03-14

这个场景非常简单:

我有一个带有一些必填字段的模型。假设其中一个是TextField,它不能为空。我还有一个表示该模型的ModelSerializer(Django Rest框架)。

当使用空字符串通过序列化程序设置该字段时,返回的错误来自模型本身(此字段不能为空)。

我只想在序列化程序级别重写错误消息,而不需要显式地重新指定序列化程序中的每个字段(我认为这违反了DRY原则),必须为每个字段编写一个validate\uuu方法,并提出我自己的ValidationError,或者必须在模型级别更改错误消息(因为有时错误消息的上下文与我的用例有关,并且应该相应地给出错误消息)。

换句话说,有没有一种方法可以像重写模型表单一样轻松地重写序列化程序级别的错误消息:

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")}}

共有3个答案

程皓轩
2023-03-14

我试图创建一个简单的序列化程序,而不是模型序列化程序。可能是因为这个原因,加布里埃尔·阿姆拉姆(Gabriel Amram)用extra_-kwargs的公认答案对我不起作用。@mariodev的另一个顶级答案确实有效,但我正在寻找一个更优雅的解决方案,并找到了一个。结果是字段类接受错误消息作为参数,这是一个覆盖默认错误消息的字典。这是文件的参考资料。它的格式与公认答案中描述的格式相同。以下是一个例子:

from rest_framework import serializers

class MySerializer(serializers.Serializer):
    client_id = serializers.IntegerField(required=True, error_messages={'required': 'Custom error message'})
空鸿云
2023-03-14

在序列化程序中:

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User

    def __init__(self, *args, **kwargs):
        super(UserSerializer, self).__init__(*args, **kwargs)

        self.fields['username'].error_messages['required'] = u'My custom required msg'

请注意,一些错误消息包含%s占位符,如:

'invalid': _("'%s' value must be either True or False."),

对于布尔字段

因此,您需要查看DRF的字段中每个字段类型中的default\u error\u消息。py,以正确使用它。

赵选
2023-03-14

编辑:我看到这个问题仍然收到一些意见,所以重要的是要注意还有另一种方法,比我在这里发布的原始答案更清晰。

您只需使用序列化程序的元类的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类属性的可能性,就像ModelForm一样。第二个继承自ModelSerializer,并使用@mariodev的技术更新错误消息。

剩下要做的就是继承它,然后做类似的事情:

class UserSerializer(CustomErrorMessagesModelSerializer):
    class Meta:
        model = User
        error_messages = {"username": {"required": "Give yourself a username"}}
 类似资料:
  • 问题内容: 该场景非常简单: 我有一个带有某些必填字段的模型。假设其中一个是不能的。我也有一个代表该模型的(Django Rest Framework)。 当使用空字符串通过序列化程序设置该字段时,返回的错误来自模型本身()。 我想仅在序列化程序级别覆盖错误消息,而无需显式重新指定序列化程序中的每个字段(我认为这违反了DRY原理),而必须为每个字段编写一个方法并引发自己的问题ValidationE

  • 我有以下ORM对象(简化): 每行有: 主键 插入行时的时间戳 computed_values要存储的实际JSONB数据 JSONB来存储计算数据的日期列表。 虽然我对列没有问题,但是对象不能被SQLAlchemy JSON序列化程序序列化。 我的想法是为该列重新定义对象的序列化程序行为。要做到这一点,我必须定义自己的自定义JSON序列化程序,或者使用一些现成的序列化程序,比如orjson。因为我

  • easyopen序列化使用fastjson处理json,xstream处理xml。现在我们来自定义实现一个json处理: 新建一个类JsonFormatter,实现ResultSerializer接口 public class JsonFormatter implements ResultSerializer { @Override public String serialize(

  • 我在一个Kafka消息中使用了我自己的类,它有一堆字符串数据类型。 我想我需要编写自己的序列化器并将其提供给生产者属性?

  • 下面的代码再现了这个问题: 上面的代码不做其他注册“自定义”序列化程序的事情(只是委托回原始序列化程序),但它生成的JSON没有null属性: {“第一个”:“鲍勃”,“最后一个”:“巴克”} 我读过许多看似相关的SO文章,但没有一篇能让我找到解决方案。我尝试在序列化时显式地将映射器设置为,但没有成功。 我唯一的线索是JavaDoc for JsonSerializer中的一条注释: 注意:永远不

  • 问题内容: 我有一个对象,其中包含一些要序列化的不可序列化字段。它们来自我无法更改的单独API,因此使它们可序列化不是一种选择。主要问题是Location类。它包含我需要的四个可以序列化的东西,所有整数。如何使用read / writeObject创建可以执行以下操作的自定义序列化方法: 我怎样才能做到这一点? 问题答案: Java支持自定义序列化。阅读“自定义默认协议”部分。 去引用: 但是,有