Django: Как вызвать функцию при изменении определенных объектов из интерфейса wagtail
У меня есть длинный список объектов "Quotation".
Цена коммерческого предложения зависит от десятков детских (и внучатых) объектов. Самый низкий из них - ставка/час.
Когда я изменяю дочерние объекты предложения, такие как ставка/час, цена предложения изменяется.
Я хотел бы автоматически пересчитывать цену каждой котировки, на которую влияет любое изменение, внесенное мной в их соответствующие объекты. Я использую Wagtail для администрирования объектов.
Я не уверен в том, как это сделать, должен ли я использовать сигналы? Крючки для трясогузки?
Модели и страницы Wagtail - это просто модели Django.
Все ли дочерние (и внучатые) модели являются одной и той же моделью? В этом случае вы можете просто зарегистрировать сигнал post_save на дочерней модели, но в целом, я бы рекомендовал использовать post_save только для таких вещей, как отправка электронного письма при изменении объекта, если вы не принимаете во внимание следующие вещи:
- Такая обработка может быстро стать очень медленной. Если у вас несколько котировок, вам нужно использовать атомарную транзакцию , иначе вы будете создавать новое соединение с БД при сохранении каждой котировки.
- Вам также понадобится prefetchдети и внуки, чтобы предотвратить множественные вызовы базы данных. .
- При сохранении других моделей внутри post_save, вы рискуете создать бесконечный цикл сигналов post_save.
Думаю, лучшим способом было бы добавить @свойство под названием price
на Quotation вместо хранения цены в базе данных:
class Quotation(models.Model):
# Model fields here
...
@property
def price(self):
return sum([child.price for child in self.children])
Это будет вычислять цену только при вызове quotation.price
. Вы можете ускорить этот расчет путем предварительной выборки дочерних элементов при получении Quotations.