Django / DRF - 如何查看模型/模型序列化程序字段的所有验证器列表?
Django / DRF - How can I view a list of all validators for a model / model serializer field?
这是我的 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',)
这是 UserExtended 模型:
class UserExtended(models.Model):
user = models.OneToOneField(User)
country = models.ForeignKey(Country)
现在,当我尝试在不输入有效国家/地区的情况下创建用户时,Django 向前端显示错误 "Incorrect type. Expected pk value, received list"。此错误消息来自哪里?因为在我的 init 函数中,我将 "invalid" 错误消息覆盖为 "Select a valid country.",但这不是我收到的消息。
此外,我打开了 shell 并做了
repr(UserExtendedSerializer())
输出为:
UserExtendedSerializer():\n country = PrimaryKeyRelatedField(queryset.Country.objects.all())
所以这里也没有列出 Django 验证器。如何查看特定模型/模型序列化器字段的所有验证器?
获取特定序列化程序字段的验证器:
要获取特定序列化程序字段的验证器,您可以执行以下操作:
my_field_validators = UserExtendedSerializer().fields['my_field'].validators
获取所有序列化程序字段的验证器:
要获取字典中所有序列化器字段的验证器,我们可以使用字典理解。
{x:y.validators for x,y in UserExtendedSerializer().fields.items()}
获取序列化器级别的验证器:
要获取在序列化程序级别定义的验证器,即在序列化程序的 Meta
class 中,您可以执行以下操作:
UserExtendedSerializer().validators
但这不是错误的来源。
None 个验证器正在生成此错误消息。发生错误是因为将无效数据传递给 country
字段的 UserExtendedSerializer
。
PrimaryKeyRelatedField
的 DRF 源代码
class PrimaryKeyRelatedField(RelatedField):
default_error_messages = {
'required': _('This field is required.'),
'does_not_exist': _("Invalid pk '{pk_value}' - object does not exist."),
'incorrect_type': _('Incorrect type. Expected pk value, received {data_type}.'), # error message
}
def to_internal_value(self, data):
try:
return self.get_queryset().get(pk=data)
except ObjectDoesNotExist:
self.fail('does_not_exist', pk_value=data)
except (TypeError, ValueError): # here error message is being generated
self.fail('incorrect_type', data_type=type(data).__name__)
因此此错误消息来自默认的 incorrect_type
错误消息。如果需要,您可以使用此键更改错误消息。
这是我的 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',)
这是 UserExtended 模型:
class UserExtended(models.Model):
user = models.OneToOneField(User)
country = models.ForeignKey(Country)
现在,当我尝试在不输入有效国家/地区的情况下创建用户时,Django 向前端显示错误 "Incorrect type. Expected pk value, received list"。此错误消息来自哪里?因为在我的 init 函数中,我将 "invalid" 错误消息覆盖为 "Select a valid country.",但这不是我收到的消息。
此外,我打开了 shell 并做了
repr(UserExtendedSerializer())
输出为:
UserExtendedSerializer():\n country = PrimaryKeyRelatedField(queryset.Country.objects.all())
所以这里也没有列出 Django 验证器。如何查看特定模型/模型序列化器字段的所有验证器?
获取特定序列化程序字段的验证器:
要获取特定序列化程序字段的验证器,您可以执行以下操作:
my_field_validators = UserExtendedSerializer().fields['my_field'].validators
获取所有序列化程序字段的验证器:
要获取字典中所有序列化器字段的验证器,我们可以使用字典理解。
{x:y.validators for x,y in UserExtendedSerializer().fields.items()}
获取序列化器级别的验证器:
要获取在序列化程序级别定义的验证器,即在序列化程序的 Meta
class 中,您可以执行以下操作:
UserExtendedSerializer().validators
但这不是错误的来源。
None 个验证器正在生成此错误消息。发生错误是因为将无效数据传递给 country
字段的 UserExtendedSerializer
。
PrimaryKeyRelatedField
class PrimaryKeyRelatedField(RelatedField):
default_error_messages = {
'required': _('This field is required.'),
'does_not_exist': _("Invalid pk '{pk_value}' - object does not exist."),
'incorrect_type': _('Incorrect type. Expected pk value, received {data_type}.'), # error message
}
def to_internal_value(self, data):
try:
return self.get_queryset().get(pk=data)
except ObjectDoesNotExist:
self.fail('does_not_exist', pk_value=data)
except (TypeError, ValueError): # here error message is being generated
self.fail('incorrect_type', data_type=type(data).__name__)
因此此错误消息来自默认的 incorrect_type
错误消息。如果需要,您可以使用此键更改错误消息。