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.

Вернуться на верх