Что происходит с автонастройкой перед сохранением в Django
Что проверяют
Знаете ли вы, что именно Django делает между вызовом save() и запросом в базу, и понимаете ли, что валидация туда не входит. По сути это вопрос про хук pre_save у полей модели.
Как отвечать
Автоматически заполняемые поля обслуживает метод самого поля pre_save(obj, add). Порядок такой: save(), затем сигнал pre_save, затем сборка списка сохраняемых полей, затем у каждого поля вызывается pre_save, который возвращает значение для запроса и при необходимости присваивает его объекту, затем INSERT или UPDATE, затем сигнал post_save.
DateFieldиDateTimeFieldсauto_now=Trueподставляют текущее время при каждом сохранении, сauto_now_add=Trueтолько при вставке.- Оба флага делают поле
editable=Falseиblank=True, поэтому его не видно ни в админке, ни вModelForm. AutoFieldзначение не придумывает: его выдаёт последовательность в базе, Django забирает результат вставки и присваивает первичный ключ объекту.FileFieldв своёмpre_saveдописывает файл в хранилище, это единственный из хуков, который ходит не только в память.
Отдельно скажите, что save() не вызывает full_clean(). Валидацию запускают формы, сериализаторы или вы сами, а голый save() отправит в базу всё, что примут её ограничения.
Где спотыкаются
Уверены, что модель валидируется при сохранении. Не валидируется: превышение max_length дойдёт до базы, и вы получите ошибку уровня СУБД вместо аккуратного ValidationError по полю.
Второе: обновляют записи через QuerySet.update() и удивляются, что дата изменения осталась старой. Массовое обновление идёт мимо save(), значит и pre_save полей, и сигналы модели не выполняются.
Третье: передают update_fields со списком полей и теряют автоматическое время. Хук вызывается только для перечисленных полей, поэтому поле с auto_now нужно либо включать в список, либо не рассчитывать на него в таком коде.