Мне просто любопытно, если кто-нибудь знает, есть ли веская причина, почему в django orm не вызывает 'full_clean' на модели, если она не сохраняется как часть формы модели.
Обратите внимание, что full_clean () не будет вызываться автоматически при вызове метода save () вашей модели. Вам нужно будет вызывать его вручную, если вы хотите запустить одношаговую проверку моделей для ваших собственных моделей, созданных вручную. полный чистый документ Джанго
(ПРИМЕЧАНИЕ: цитата обновлена для Django 1.6 ... предыдущие документы django также содержали предупреждение о ModelForms.)
Есть ли веские причины, по которым люди не хотят такого поведения? Я думаю, что если бы вы потратили время на добавление проверки в модель, вы бы хотели, чтобы проверка выполнялась при каждом сохранении модели.
Я знаю, как заставить все работать правильно, я просто ищу объяснение.
pre_save
крючок и сделатьfull_clean
на всех пойманных моделях.Ответы:
AFAIK, это из-за обратной совместимости. Есть также проблемы с ModelForms с исключенными полями, моделями со значениями по умолчанию, сигналами pre_save () и т. Д.
Источники, которые могут вас заинтересовать:
источник
Из-за совместимости автоматическая очистка при сохранении не включена в ядре django.
Если мы начинаем новый проект и хотим, чтобы
save
метод по умолчанию для Model мог очищаться автоматически, мы можем использовать следующий сигнал для очистки перед сохранением каждой модели.источник
if send == somemodel, then exclude some fields
вpre_save_handler
ValidationError: Session with this Session key already exists
. Чтобы избежать этого, вам нужно добавить оператор if дляsender in list_of_model_classes
предотвращения переопределения сигнала моделями аутентификации Django по умолчанию. Определите, какlist_of_model_classes
вы выберетеСамый простой способ вызвать
full_clean
метод - просто переопределитьsave
метод в вашемmodel
:источник
Вместо вставки фрагмента кода, который объявляет получателя, мы можем использовать приложение в качестве
INSTALLED_APPS
раздела вsettings.py
Перед этим вам может потребоваться установка
django-fullclean
с использованием PyPI:источник
pip install
какое-то приложение с 4 строками кода (проверить исходный код ) вместо того, чтобы писать эти строки самостоятельно?Если у вас есть модель, которую вы хотите гарантировать, чтобы она имела хотя бы одно отношение FK, и вы не хотите использовать ее,
null=False
потому что для этого требуется установить FK по умолчанию (который будет представлять собой данные для мусора), лучший способ, который я придумаю, это добавить кастом.clean()
и.save()
методы..clean()
вызывает ошибку проверки и.save()
вызывает чистую. Таким образом, целостность обеспечивается как из форм, так и из другого вызывающего кода, командной строки и тестов. Без этого (AFAICT) нет способа написать тест, который гарантирует, что модель имеет отношение FK к специально выбранной (не по умолчанию) другой модели.источник
Комментируя ответ @Alfred Huang и комментируя его. Можно привязать хук pre_save к приложению, определив список классов в текущем модуле (models.py) и проверив его в хуке pre_save:
источник