DjangoRestFramework ModelSerializer:字段级验证不起作用
DjangoRestFramework ModelSerializer: field-level validation is not working
这是我的serializers.py(我想为内置用户模型创建一个序列化程序):
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.')
问题是,当我尝试使用已经存在的用户名创建用户时,它 returns 以下字典:
{'username': [u'This field must be unique.']}
而不是说
{'username': [u'Username is already taken']}
我为此重新创建了 validate_username 函数(出于测试目的):
def validate_username(self, username):
raise serializers.ValidationError('Testing to see if an error is raised.')
并且它不会引发错误。知道为什么 DjangoRestFramework 会忽略 validate_username 函数吗?
编辑:请注意,我使用的是 ModelSerializer(在此处的教程中:http://www.django-rest-framework.org/api-guide/serializers/#validation 它仅讨论序列化程序的字段级验证,而不是 ModelSerializer)。请注意确定它是否有所作为。
字段级验证在序列化程序级验证之前调用。
所以模型 User
的用户名是 unique=True
,由于用户名已经存在,字段级验证将引发异常。 DRF 的 UniqueValidator
会在字段不唯一时引发异常。
根据 DRF 源代码,
class UniqueValidator:
"""
Validator that corresponds to `unique=True` on a model field.
Should be applied to an individual field on the serializer.
"""
message = _('This field must be unique.')
由于这些验证器 运行 在序列化程序级验证之前,您的 validate_username
永远不会被调用。
尝试在您的序列化器中添加以下行以使该验证器正常工作。
class UserSerializer(serializers.ModelSerializer):
username = serializers.CharField(max_length=32)
class Meta:
model = User
fields = ('username', 'password', 'email', )
这是我的serializers.py(我想为内置用户模型创建一个序列化程序):
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.')
问题是,当我尝试使用已经存在的用户名创建用户时,它 returns 以下字典:
{'username': [u'This field must be unique.']}
而不是说
{'username': [u'Username is already taken']}
我为此重新创建了 validate_username 函数(出于测试目的):
def validate_username(self, username):
raise serializers.ValidationError('Testing to see if an error is raised.')
并且它不会引发错误。知道为什么 DjangoRestFramework 会忽略 validate_username 函数吗?
编辑:请注意,我使用的是 ModelSerializer(在此处的教程中:http://www.django-rest-framework.org/api-guide/serializers/#validation 它仅讨论序列化程序的字段级验证,而不是 ModelSerializer)。请注意确定它是否有所作为。
字段级验证在序列化程序级验证之前调用。
所以模型 User
的用户名是 unique=True
,由于用户名已经存在,字段级验证将引发异常。 DRF 的 UniqueValidator
会在字段不唯一时引发异常。
根据 DRF 源代码,
class UniqueValidator:
"""
Validator that corresponds to `unique=True` on a model field.
Should be applied to an individual field on the serializer.
"""
message = _('This field must be unique.')
由于这些验证器 运行 在序列化程序级验证之前,您的 validate_username
永远不会被调用。
尝试在您的序列化器中添加以下行以使该验证器正常工作。
class UserSerializer(serializers.ModelSerializer):
username = serializers.CharField(max_length=32)
class Meta:
model = User
fields = ('username', 'password', 'email', )