Насколько я знаю, есть 3 способа создания / обновления экземпляров модели (которые являются записями в таблицах базы данных):
- Использование метода экземпляра модели
save()
.
- Использование методов набора запросов
create()
, update()
, get_or_create()
, update_or_create()
и bulk_create()
.
- Использование необработанного SQL или других низкоуровневых способов.
Если вы намереваетесь вычислить значение поля при сохранении, вы можете переопределить все методы, перечисленные выше.
Сигналы (например, pre_create
) не являются полным решением, поскольку они не запускаются при использовании bulk_create()
, и поэтому некоторые экземпляры могут быть сохранены без вычисляемого атрибута.
Нет способа django (который я знаю) перехватить третью точку, которую я упомянул (необработанный SQL).
Вы не уточнили свой вариант использования, но (в зависимости от размера таблицы и частоты изменений), возможно, вы также можете попробовать:
- запустить периодический процесс (возможно, с использованием
crontab
), который обновляет вычисляемое поле всех экземпляров модели.
- добавить триггер базы данных, который вычисляет поле.
Устаревшие базы данных или системы, или, как правило, работать с ними неинтересно, поэтому, возможно, вам придется согласиться на неоптимальное решение.