这个场景很简单:
我有一个模型,其中包含一些必填字段.让我们说其中一个是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) 我想在向数据库添加新项时自定义JSON响应,它返回以下内容.
HTTP 400 BAD REQUEST
Content-Type: application/json Vary:
Accept Allow: POST, OPTIONS
{
"nick": [
"Users with this Nick already exists."
]
}
Run Code Online (Sandbox Code Playgroud)
和
{
"nick": [
"Your username is empty"
]
}
Run Code Online (Sandbox Code Playgroud)
我希望它返回(此用户名已存在,请使用其他用户名.)
要么
"Username %s already exists", (self.nick)
Run Code Online (Sandbox Code Playgroud)
我使用了以下示例,但如果值为空或无效,则无效.
def validate_title(self, attrs, source):
"""
Check that the blog post is about Django.
"""
value = attrs[source]
if "django" not in value.lower():
raise serializers.ValidationError("Blog post is not about Django")
return attrs
Run Code Online (Sandbox Code Playgroud)
这是发送到API的JSON.
{
"name": "myname",
"nick":"",
"type_account":"1",
"email":"my-email@gmail.com",
"pass_field":"12345" …
Run Code Online (Sandbox Code Playgroud) 我正在使用基于 Django 类的视图和休息框架
object = self.get_object()
Run Code Online (Sandbox Code Playgroud)
在详细视图中,如果对象不存在并且我确实收到了类似的请求
/user/10
Run Code Online (Sandbox Code Playgroud)
然后我得到这个回应
{"detail": "not found"}
Run Code Online (Sandbox Code Playgroud)
现在我想自定义该响应
喜欢
try:
obj = self.get_object()
except:
raise Exception("This object does not exist")
Run Code Online (Sandbox Code Playgroud)
但这不起作用
这是我的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', )
Run Code Online (Sandbox Code Playgroud)
我知道Django Rest Framework有它自己的字段验证器,因为当我尝试使用已经存在的用户名创建用户时,它会引发一个错误:
{'username': [u'This field must be unique.']}
Run Code Online (Sandbox Code Playgroud)
我想自定义错误消息并让它说"此用户名已被占用.请再试一次"而不是说"此字段必须是唯一的".
它还有一个内置的正则表达式验证器,因为当我创建带有感叹号的用户名时,它会说:
{'username': [u'Enter a valid username. This value may contain only letters, numbers and @/./+/-/_ characters.']}
Run Code Online (Sandbox Code Playgroud)
我想自定义正则表达式验证器,以便它只是说"无效的用户名".
如何自定义每个字段的所有错误消息?
注意:根据这篇文章:Django Rest Framework序列化程序中的自定义错误消息我可以这样做:
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'
Run Code Online (Sandbox Code Playgroud)
但是我如何为"独特"和"正则表达式"验证器做些什么呢?我试过了
self.fields['username'].error_messages['regex'] = u'My custom …
Run Code Online (Sandbox Code Playgroud) django validation error-handling django-serializer django-rest-framework