2013-08-07 2 views
1

Обработка уникальности в коде Django, я нашел проблему: как проверить записи на валидаторах, но исключая себя, потому что функция обновления?django objects.filter exclude yourself

Я пробую ниже, но не работает.

Пожалуйста, помогите мне?

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]) 
+1

Почему не просто установить 'уникальный = true' на поле электронной почты? – Brandon

+1

Привет Брэндон, потому что пустые электронные письма разрешены. Tks. –

+0

Вы можете установить unique = True и blank = True. Установщик поля будет запущен только в том случае, если оно присутствует. – Brandon

ответ

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') 
0

__in требует список для проверки. Попробуйте

Person.objects.filter(email=email_given).exclude(id__in=[myid]) 
+0

'id = myid' даст тот же результат – karthikr

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!") 

Вам не нужно использовать __in по идентификатору, как это только один идентификатор.

+0

Hi Aamir, я тоже пробовал это, но не работает! Я получаю сообщение о том, что id отсутствует в Лице, но он есть. Tks! –

+0

'Лицо' также является именем модели. Я не вижу, как вы передаете объект модели Person в 'check_email_person'. Поэтому 'Person.id' ошибочен, так как django попытается получить атрибут' id' из модели класса Person. –

Смежные вопросы