【问题标题】:Django models default error messages into one fieldDjango 将默认错误消息建模为一个字段
【发布时间】:2016-05-23 09:58:51
【问题描述】:

这个非常简单的 django restframework 代码。

models.py

class User(models.Model)
    Email = models.CharField(max_length=100)
    Username = models.CharField(max_length=100)
    State = models.CharField(max_length=100)

序列化器.py

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('Email','Username','State')

views.py

class UserList(generics.ListCreateAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer

如果使用这个我会得到这样的错误输出

{
    "Email": [
        "This field may not be blank."
    ],
    "Username": [
        "This field may not be blank."
    ],
    "Country": [
        "This field may not be blank."
    ],
}

但我需要像这样更改错误。我该如何存档这个,任何建议都非常感谢。

{"error": 
    [
    "Email is required",
    "Username is required",
    "County is required"
    ]

}

【问题讨论】:

  • 这背后的目的是什么?
  • 我正在将我的 API 提供给我的前端开发人员,他提出了要求并且他正在使用 angularjs。
  • 可能值得向您的前端开发人员解释为什么它们实际上是分开的,它们与实际字段相关
  • 我认为将这些字段错误与非字段错误分开是一种更好的做法。因此,如果您希望在任何时候显示username 字段中的错误,您都可以!
  • 我完全理解 @Sayse 是什么,但我也看到了一些编写 API 的最佳实践,我问我的一些朋友,他们是移动开发人员,他们也期望单个对象中出现错误。

标签: django django-models django-rest-framework


【解决方案1】:

您始终可以从通用视图覆盖创建/更新方法。它会是这样的:

class UserList(generics.ListCreateAPIView):

    queryset = User.objects.all()
    serializer_class = UserSerializer

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        if not serializer.is_valid(raise_exception=False):
            # TODO: add here your custom error dict using serializer.errors
            return Response({"error":...}, status=...)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

或者...您可以尝试覆盖序列化程序...如果您不想覆盖视图。

(但是,JS 开发人员无法解析简单的 json 错误对象一定有充分的理由:P)

希望对你有帮助

【讨论】:

    【解决方案2】:

    您可以为任何错误情况定义自己的错误消息:

    class UserSerializer(serializers.ModelSerializer):
        class Meta:
            model = User
            fields = ('Email','Username','State')
    
        def __init__(self, *args, **kwargs):
            super(UserSerializer, self).__init__(*args, **kwargs)
            for field in self.Meta.fields:
                self.fields[field].error_messages['required'] = "%s is required" % field
    

    【讨论】:

    • 如果我使用媒体类型:application/json,它会给我默认错误,但如果我使用媒体类型:application/x-www-form-urlencoded,那么它会给我自定义错误消息。
    猜你喜欢
    • 2010-12-01
    • 1970-01-01
    • 2015-09-26
    • 2011-06-04
    • 2013-11-15
    • 2012-01-24
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多