相关疑难解决方法(0)

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

这个场景很简单:

我有一个模型,其中包含一些必填字段.让我们说其中一个是TextField不可能的blank.我还有一个ModelSerializer代表该模型的(Django Rest Framework).

当使用空字符串通过序列化程序设置该字段时,返回的错误来自模型本身(This field can't be blank).

我想只在序列化程序级别覆盖错误消息,而不需要显式地重新指定序列化程序中的每个字段(我认为这是违反DRY原则),必须validate_为每个字段编写一个方法并提高我自己的ValidationError或者必须更改Model级别中的错误消息(因为有时错误消息的上下文对我的用例很重要,因此应该给出错误消息).

换句话说,有没有办法在序列化程序级别覆盖错误消息,就像它对于ModelForm:

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")}}
Run Code Online (Sandbox Code Playgroud)

django django-rest-framework

26
推荐指数
6
解决办法
2万
查看次数

如何将自定义错误代码添加到Django Rest Framework

我正在将API与Django Rest Framework组合在一起。我想自定义我的错误处理。我阅读了很多有关自定义错误处理的内容(link1link2link3),但是找不到适合我需要的内容。

基本上,我想更改错误消息的结构以获取如下信息:

{
  "error": True,
  "errors": [
    {
      "message": "Field %s does not exist",
      "code": 1050
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

代替 :

{"detail":"Field does not exist"}
Run Code Online (Sandbox Code Playgroud)

我已经有一个自定义ExceptionMiddleware来捕获500个错误并返回JSON,但是我无法处理所有其他错误。

ExceptionMiddleware的代码:

class ExceptionMiddleware(object):

    def process_exception(self, request, exception):

        if request.user.is_staff:
            detail = exception.message
        else:
            detail = 'Something went wrong, please contact a staff member.'

        return HttpResponse('{"detail":"%s"}'%detail, content_type="application/json", status=500)
Run Code Online (Sandbox Code Playgroud)

从Django doc中:

请注意,将仅针对由引发的异常生成的响应调用异常处理程序。它不会用于视图直接返回的任何响应,例如,当序列化程序验证失败时,通用视图返回的HTTP_400_BAD_REQUEST响应。

这正是我想要实现的,自定义这400个错误。

非常感谢,

python django exception-handling django-rest-framework

6
推荐指数
2
解决办法
3003
查看次数

DjangoRestFramework ModelSerializer:字段级验证不起作用

这是我的serializers.py(我想为内置的User模型创建一个序列化器):

from rest_framework import serializers

from django.contrib.auth.models import User

class UserSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields = ('username', 'password', 'email', )

    def validate_username(self, username):
        if not re.search(r'^\w+$', username): #checks if all the characters in username are in the regex. If they aren't, it returns None
            raise serializers.ValidationError('Username can only contain alphanumeric characters and the underscore.')
        try:
            User.objects.get(username=username)
        except ObjectDoesNotExist:
            return username
        raise serializers.ValidationError('Username is already taken.')
Run Code Online (Sandbox Code Playgroud)

问题是,当我尝试使用已存在的用户名创建用户时,它会返回以下字典:

{'username': [u'This field must be unique.']}
Run Code Online (Sandbox Code Playgroud)

而不是说

{'username': [u'Username is already taken']} …
Run Code Online (Sandbox Code Playgroud)

django error-handling django-models django-serializer django-rest-framework

5
推荐指数
1
解决办法
1499
查看次数