Джанго: Запускается ли model_instance.clean() перед базовыми валидаторами?

Допустим, у меня есть модель:

class Ticket(models.Model):
    client = models.ForeignKey(Client)
    color = models.CharField(max_length=255)

    def clean(self):
        self.color = self.client.favorite_color

Когда я запускаю это на последней версии Django (глава SVN 15 минут назад), если я нажимаю «Сохранить», не выбирая client, я получаю ошибку DoesNotExist внутри моего метода очистки (для части self.client.favorite_color). Поскольку для модели требуется атрибут client, разве это не должно быть обработано до моей пользовательской проверки в clean()?

Вот документация, которую я читаю: http://docs.djangoproject.com/en/dev/ref/models/instances/#id1


person orokusaki    schedule 26.01.2010    source источник
comment
Можно ли использовать функцию очистки на моделях? Я думал, что это только для ModelForms?   -  person fijter    schedule 26.01.2010
comment
@ D4V360: OP относится к версии SVN. Был введен метод clean. Посмотреть все методы модели: docs.djangoproject.com/ ru/dev/ref/models/instances/   -  person Felix Kling    schedule 27.01.2010
comment
Если вы собираетесь удалить SVN, используйте версию #12267. В #12268 и вперед, пока не исправят (я поставил тикет), если вы вызовете ValidationError('с такой строкой, которая задокументирована'), в django.forms.models возникает ошибка во время выполнения из-за ошибка. 12268, где эта ошибка была представлена.   -  person orokusaki    schedule 27.01.2010
comment
См. code.djangoproject.com/ticket/12698, если вам интересно, о чем говорит Орокусаки. !   -  person Dominic Rodger    schedule 27.01.2010


Ответы (2)


Я понял, если кто-то столкнется с этой проблемой:

В full_clean() на модели сначала запускается clean_fields(), но ошибки не выводятся для отображения и т. д. Вместо этого они просто добавляются в dict(), а затем в clean(), который является настраиваемым методом проверки для вашей модели. запускается, чтобы добавить любую из ваших пользовательских ошибок в dict. Только после этого снова возникают ошибки.

person orokusaki    schedule 26.01.2010

clean() вызывается ModelForms, а не моделями.

См. документы.

Чтобы сделать то, что вы хотите сделать на уровне модели, переопределить метод save().

Редактировать после комментария: Что ж, похоже, пришло время снова прочитать документацию в связи с грядущим обновлением 1.2. :-) Спасибо, что указали на это.

person cethegeek    schedule 26.01.2010
comment
clean() теперь также является методом модели. Вот ссылка: docs.djangoproject.com/en/dev/ref /модели/экземпляры/#id1 - person orokusaki; 26.01.2010
comment
@celopes LOL, я знаю. Я бы пожаловался, но я слишком рано вхожу в свой проект, поэтому я еженедельно проверяю SVN и исправляю ошибки по ходу дела, потому что эта проверка модели — это то, о чем я всегда мечтал, и есть больше новых вещей, таких как queryset.exists() и т. д. Если вы собираетесь использовать SVN для этой новой проверки, я бы взял версию № 12268. - person orokusaki; 27.01.2010