【问题标题】:Django / DRF - How can I view a list of all validators for a model / model serializer field?Django / DRF - 如何查看模型/模型序列化器字段的所有验证器列表?
【发布时间】:2015-10-04 00:33:54
【问题描述】:

这是我的 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 函数中,我将“无效”错误消息覆盖为“选择一个有效的国家。”,但这不是我收到的消息。

另外,我打开了shell并做了

repr(UserExtendedSerializer())

输出是:

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

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

【问题讨论】:

  • 检查服务器中的错误。您的用户在其中一个字段上获得了一个列表,而不是外来对象的 pk。
  • @cdvv7788 这是一个 400 错误,这很好。由于最终用户的输入,它正在接收列表。我的问题不是错误消息本身,而是如何查看 Django 序列化程序/模型字段上的验证器列表?因为 "self.fields[field].error_messages['invalid'] = 'Select a valid %s.'%field" 没有覆盖错误消息,所以必须有另一个我没有看到的验证器(我最终想要覆盖验证器引发的错误消息,但我需要先找出错误消息的来源才能做到这一点)。

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


【解决方案1】:

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

要获取特定序列化器字段的验证器,您可以:

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

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

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

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

获取序列化程序级别的验证器:

要获得在序列化程序级别定义的验证器,即在序列化程序的Meta 类中,您可以这样做:

UserExtendedSerializer().validators

但这不是错误的来源。

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

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

【讨论】:

  • 当我执行“my_field_validators = UserExtendedSerializer().fields['country'].validators”时,输出为“[]”。然后我做了“{x:y.validators for x,y in UserExtendedSerializer().fields.items()}”,输出是“{'country':[]}”,然后当我做了“UserExtendedSerializer().验证器”,输出为“[]”。错误消息“不正确的类型。预期的 pk 值,收到的列表”从哪里来?什么验证器正在验证预期的 pk 值,并在未给出 pk 值时抛出上面的错误消息? (当我运行您提供的命令时,没有显示验证器)。
  • 错误消息不是来自validators。空的validators 列表仅表示没有使用validators。默认错误消息incorrect_type 包含此错误消息。更新了 ans 以反映相同的情况。
猜你喜欢
  • 1970-01-01
  • 2020-05-23
  • 1970-01-01
  • 1970-01-01
  • 2018-11-18
  • 1970-01-01
  • 2019-08-28
  • 2018-06-18
  • 2018-01-30
相关资源
最近更新 更多