DjangoRestFramework 忽略自定义错误消息
DjangoRestFramework ignoring custom error messages
这是我的 UserExtendedSerializer:
class UserExtendedSerializer(serializers.ModelSerializer):
def __init__(self, *args, **kwargs):
super(UserExtendedSerializer, self).__init__(*args, **kwargs) # call the super()
for field in self.fields: # iterate over the serializer fields
self.fields[field].error_messages['required'] = 'Enter a valid %s.'%field # set the custom error message
self.fields[field].error_messages['invalid'] = 'Select a valid %s.'%field # set the custom error message
class Meta:
model = UserExtended
fields = ('country',)
这是我的 models.py:
class Country(models.Model):
countryName = models.CharField(max_length=50, unique=True)
countryCode = models.CharField(max_length=10, unique=True)
class UserExtended(models.Model):
user = models.OneToOneField(User)
country = models.ForeignKey(Country)
我的问题是,当用户提交无效类型时(Django 需要整数/pk 值,但假设用户提交字符串 "a"),Django 会向前端发送错误消息 "Incorrect type. Expected pk value, received list." 即使我覆盖了序列化程序中的 "invalid" 错误消息。为什么发送到前端的错误消息不是"Select a valid country"而是"Incorrect type. Expected pk value, received list."?
首先执行 Django 验证,因此您可以将 country field
设置为只读并阻止 Django 模型验证,然后在您的 update/create
方法中验证国家并在需要时引发错误。您还需要创建 CountrySerializer
class CountrySerializer(serializers.ModelSerializer):
#country serializer fields goes here
class UserExtendedSerializer(serializers.ModelSerializer):
country = CountrySerializer(read_only=True)
class Meta:
model = UserExtended
fields = ('country',)
def check_country(self):
request = self.context['request']
data = request.data
country_data = data.get('country'):
#Validated your country data
#valid_country = .....
if not valid_country:
raise serializers.ValidationError("Select a valid country")
def create(self,validated_data):
self.check_country()
super(UserExtended,self).create(self,validated_data)
def update(self,instance,validated_data):
self.check_country()
super(UserExtended,self).update(self,instance,validated_data)
这是我的 UserExtendedSerializer:
class UserExtendedSerializer(serializers.ModelSerializer):
def __init__(self, *args, **kwargs):
super(UserExtendedSerializer, self).__init__(*args, **kwargs) # call the super()
for field in self.fields: # iterate over the serializer fields
self.fields[field].error_messages['required'] = 'Enter a valid %s.'%field # set the custom error message
self.fields[field].error_messages['invalid'] = 'Select a valid %s.'%field # set the custom error message
class Meta:
model = UserExtended
fields = ('country',)
这是我的 models.py:
class Country(models.Model):
countryName = models.CharField(max_length=50, unique=True)
countryCode = models.CharField(max_length=10, unique=True)
class UserExtended(models.Model):
user = models.OneToOneField(User)
country = models.ForeignKey(Country)
我的问题是,当用户提交无效类型时(Django 需要整数/pk 值,但假设用户提交字符串 "a"),Django 会向前端发送错误消息 "Incorrect type. Expected pk value, received list." 即使我覆盖了序列化程序中的 "invalid" 错误消息。为什么发送到前端的错误消息不是"Select a valid country"而是"Incorrect type. Expected pk value, received list."?
首先执行 Django 验证,因此您可以将 country field
设置为只读并阻止 Django 模型验证,然后在您的 update/create
方法中验证国家并在需要时引发错误。您还需要创建 CountrySerializer
class CountrySerializer(serializers.ModelSerializer):
#country serializer fields goes here
class UserExtendedSerializer(serializers.ModelSerializer):
country = CountrySerializer(read_only=True)
class Meta:
model = UserExtended
fields = ('country',)
def check_country(self):
request = self.context['request']
data = request.data
country_data = data.get('country'):
#Validated your country data
#valid_country = .....
if not valid_country:
raise serializers.ValidationError("Select a valid country")
def create(self,validated_data):
self.check_country()
super(UserExtended,self).create(self,validated_data)
def update(self,instance,validated_data):
self.check_country()
super(UserExtended,self).update(self,instance,validated_data)