Django / DRF - 如何查看模型/模型序列化器字段的所有验证器列表?

时间:2015-10-04 00:33:55

标签: django django-models django-rest-framework django-validation django-serializer

这是我的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向前端发出错误,说“不正确的类型。预期的pk值,收到的列表”。此错误消息来自何处?因为在我的init函数中,我覆盖了“无效”错误消息,说“选择一个有效的国家/地区。”,但这不是我收到的消息。

另外,我打开了外壳并做了

repr(UserExtendedSerializer())

,输出结果为:

UserExtendedSerializer():\n country = PrimaryKeyRelatedField(queryset.Country.objects.all())

所以这里也没有列出Django验证器。如何查看特定型号/型号序列化器字段的所有验证器?

1 个答案:

答案 0 :(得分:1)

获取特定序列化程序字段的验证程序:

要获取特定序列化程序字段的验证程序,您可以执行以下操作:

my_field_validators = UserExtendedSerializer().fields['my_field'].validators

获取所有序列化程序字段的验证器:

要获取字典中所有序列化字段的验证器,我们可以使用字典理解。

{x:y.validators for x,y in UserExtendedSerializer().fields.items()}

获取序列化程序级验证程序:

要获得在序列化程序级别定义的验证程序,即在序列化程序的Meta类中,您可以执行以下操作:

UserExtendedSerializer().validators

但这不是错误的来源。

没有验证器生成此错误消息。由于将UserExtendedSerializer字段的无效数据传递给country,因此发生错误。

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错误消息。如果需要,可以使用此键更改错误消息。