django objects.filter排除你自己

时间:2013-08-07 19:22:28

标签: python django django-admin

处理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])

3 个答案:

答案 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])