Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 带有源字段的UniqueValidator_Django_Django Rest Framework - Fatal编程技术网

Django 带有源字段的UniqueValidator

Django 带有源字段的UniqueValidator,django,django-rest-framework,Django,Django Rest Framework,我有模型用户配置文件: class UserProfile(models.Model): user = models.OneToOneField(User) 和序列化程序: email = serializers.CharField(source='user.email', required=False, validators=[UniqueValidator(queryset=User.objects.all())])

我有模型用户配置文件:

class UserProfile(models.Model):
   user = models.OneToOneField(User)
和序列化程序:

email = serializers.CharField(source='user.email', required=False,
                                  validators=[UniqueValidator(queryset=User.objects.all())])
序列化可以正常工作,但反序列化不行-它尝试在用户模型中归档“user.email”字段,当然失败了

如果我在queryset中将User更改为UserProfile,它将失败,并出现另一个错误:

基数为10的int()的文本无效:'admin@localhost"


是否可以为序列化和反序列化设置不同的源?

默认情况下,
UniqueValidator
希望
(或字段名,如果未给出
),可以在提供给的
查询集
中使用。因此,通过使用跨关系的源(并且有一个点),它将在过滤失败的查询集时尝试使用该名称,正如您所注意到的

您可以通过子类化
UniqueValidator
来解决此问题,以覆盖
filter\u queryset
方法对其进行不同的过滤

class CustomUniqueValidator(UniqueValidator):

    def filter_queryset(self, value, queryset):
        """
        Filter the queryset to all instances matching the given attribute.
        """
        filter_kwargs = {"email": value}
        return queryset.filter(**filter_kwargs)

此硬编码
电子邮件
作为过滤器,不硬编码的一个可能选项是拆分
self.field\u name
并获取虚线源的最后一部分。

尝试在序列化程序中使用自定义字段