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
并获取虚线源的最后一部分。尝试在序列化程序中使用自定义字段