处理Django代码中的唯一性,我发现了一个问题:如何在验证器上检查记录,但排除自己,因为更新函数?
我在下面尝试,但不起作用。
拜托,你能帮助我吗?
model.py
def check_email_person(email_given):
myid = Person.id
if Person.objects.filter(email=email_given).exclude(id__in=myid):
raise ValidationError(u"E-mail already exists!")
class Person(models.Model):
email = models.EmailField(blank=True, null=True, validators=[check_email_person])
答案 0 :(得分:1)
最好的方法是在unique=True
字段上email
建议Brandon
。但是现在你的问题可以解决:
def check_email_person(email_given):
myid = Person.id
if Person.objects.filter(email=email_given).exclude(id=myid):
raise ValidationError(u"E-mail already exists!")
您不需要在ID上使用__in
,因为它只是一个ID。
答案 1 :(得分:1)
您应该在表单验证中执行以下操作:
def clean_email(self):
email = self.cleaned_data["email"]
try:
User.objects.get(email=email)
except User.DoesNotExist:
return email
raise forms.ValidationError('duplicate_email')
答案 2 :(得分:0)
__in
需要一个列表来检查。尝试
Person.objects.filter(email=email_given).exclude(id__in=[myid])