首页 > 解决方案 > Django DRF 在错误消息中显示字段的详细名称

问题描述

当模型字段验证失败时,我希望 DRF 在错误消息中返回字段 verbose_name。

例子 :

模型.py:

class MyClass(models.Model):
    myfield = model.CharField(max_length=20,\
                              verbose_name="This is the field",\
                              default="blabla")

serialiers.py :

class MyClassSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyClass
        fields = ('myfield',)

如果此字段的 POSTED 数据超过 20 个字符,则响应负载为:

{"myfield":["the error message..........."]}

为了为用户提供更友好的消息(...并轻松管理错误:-)),我想使用模型字段的 verbose_name,因此响应有效负载将是:

{"This is the field":["the error message..........."]}

你有什么主意吗?谢谢!

标签: djangodjango-rest-framework

解决方案


我认为没有一种简单的方法可以做到这一点。最简单的方法是覆盖errors序列化程序的属性并使用详细名称更改错误键。

class TestSerializer(serializers.ModelSerializer):
    class Meta:
        model = ...
        fields = ('field1', ...)

    @property
    def errors(self):
        # get errors
        errors = super().errors
        verbose_errors = {}

        # fields = { field.name: field.verbose_name } for each field in model
        fields = {field.name: field.verbose_name for field in
                   self.Meta.model._meta.get_fields() if hasattr(field, 'verbose_name')}

        # iterate over errors and replace error key with verbose name if exists
        for field_name, error in errors.items():
            if field_name in fields:
                verbose_errors[str(fields[field_name])] = error
            else:
                verbose_errors[field_name] = error
        return verbose_errors

推荐阅读