![](/img/trans.png)
[英]Django rest framework:UniqueValidator copare the field convert to upper case
[英]UniqueValidator with source field
我有模型UserProfile:
class UserProfile(models.Model):
user = models.OneToOneField(User)
和序列化器:
email = serializers.CharField(source='user.email', required=False,
validators=[UniqueValidator(queryset=User.objects.all())])
序列化工作正常,但是反序列化却不能—尝试在用户模型中归档“ user.email”字段,当然会失败。
如果我在查询集中将用户更改为UserProfile,它将失败并出现另一个错误:
以10为底的int()的无效文字:“ admin @ localhost”
可以为序列化和反序列化设置不同的来源吗?
默认情况下, UniqueValidator
预计, source
(或字段名称,如果没有source
给出)可以在所使用的queryset
被提供给过滤掉现有的对象 。 因此,正如您所注意到的,通过使用跨越关系(并带有点)的源,它将在过滤失败的查询集时尝试使用该名称。
您可以通过子类化UniqueValidator
来解决此问题,以覆盖filter_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)
将此email
硬编码为过滤器,不进行硬编码的一种可能选择是拆分self.field_name
并获得点缀源的最后一部分。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.