2013-12-13 3 views
3

Я работаю с собственным методом, чтобы увидеть, есть ли в какой-либо другой таблице поле с той же строкой. Все это прекрасно, пока я его создаю, но когда я пытаюсь его отредактировать, он находит «сам» и возвращает ошибку. я теперь интересно, как я могу исключить сам экземпляр в моем чистом методеdjango exclude self from queryset для проверки

def clean_name(self): 
    raw_data = self.cleaned_data['name'] 
    data = raw_data.title() 

    if Country.objects.filter(name=data).exists(): 
     raise forms.ValidationError(("There is already a country with the name: %s") % data) 
    if Province.objects.filter(name=data).exists(): 
     raise forms.ValidationError(("There is already a province with the name: %s") % data) 
    if Region.objects.filter(name=data).exists(): 
     raise forms.ValidationError(("There is already a region with the name: %s") % data) 
    return data 

я знаю, что есть .exclude(), но нуждается в переменном передаются вместе с ним, не знаю, как я мог бы получить что вместе с моим чистым методом

+1

Эй, не понимаю, почему вы проверяете 3 разных класса моделей, а не только тот, где конфликт с одним и тем же именем. Обычно вы исключаете идентификатор существующего объекта, но в этом случае мы говорим об этом сущности? Это «страна», «провинция» или «регион»? –

+1

Это похоже на странное требование, но оно может быть совершенно справедливым в контексте всего приложения, о котором мы ничего не знаем. –

+0

Я не хочу, чтобы название страны/региона/региона было одним и тем же вопросом стиля, а все 3 - разные таблицы. не знаю, как это сделать тогда, как это –

ответ

6

Предполагая, что ваш метод clean_name находится на ModelForm, вы можете получить доступ к соответствующему экземпляру модели по адресу self.instance. Во-вторых, простой способ определить, был ли экземпляр модели вновь создан или уже существует в базе данных, является проверка значения его первичного ключа. Если первичный ключ None, модель будет создана.

Итак, ваша логика проверки может выглядеть следующим образом:

def clean_name(self): 
    name = self.cleaned_data['name'].title() 
    qs = Country.objects.filter(name=name) 
    if self.instance.pk is not None: 
     qs = qs.exclude(pk=self.instance.pk) 
    if qs.exists(): 
     raise forms.ValidationError("There is already a country with name: %s" % name) 

Я только один запрос, показанный набор для ясности. Я бы, вероятно, создал кортеж, содержащий все три набора запросов, и перебирал их. Код для добавления предложения exclude, а вызов exists() может быть обработан внутри цикла, и поэтому его нужно только однократно записать (DRY).

+0

Я не могу попробовать это около часа, но да, действительно, это ModelForm, плохо думайте, что это может сработать. Я держу вас в курсе –

+0

Спасибо за работы (и гораздо более простым способом я подумал ^^ –