Какой самый простой способ выполнить общие вычисления для дочерних объектов? - PullRequest
1 голос
/ 10 июня 2009

Мне нужно выполнить ряд простых вычислений для объекта модели «Счет-фактура», с которым связано несколько дочерних элементов «Заказ», которые содержат количество заказа, его стоимость и т. Д. заказ в виде строк)

Код, с которым я сейчас работаю, выполняет такие вычисления следующим образом:

Счет-фактура (models.py)

def save():
    #get the total of all associated orders
    for order in self.invoice_orders.all():
    self.invoice_net_total += order.order_value
    super(Invoice, self).save()

Что вызывает некоторые проблемы при изменении количества дочернего заказа и последующем сохранении формы - вместо новой общей суммы я получаю предыдущую сумму, только при повторном сохранении общая сумма исправляется сама. Возможно, благодаря тому, как Django сохраняет родительские и дочерние объекты?

Другой вариант, с которым я играл, заключался в переносе этого вычисления на объект дочернего заказа (подготовка к ужасному коду):

Заказ (models.py)

def save():
  if not self.id:
    self.invoice.invoice_net_total += self.order_value
  elif self.id:
    #grab old instance
    old = Order.objects.get(pk=self.id)
    #remove that old total
    self.invoice.invoice_net_total -= old.order_value
    self.invoice.save()
    #add new total
    self.invoice.invoice_net_value += self.order_value
    self.invoice.save()

Хотя это тоже не очень эффективно.

Хотите знать, кто-нибудь может привести меня к прямому способу обеспечения того, чтобы эти кальки работали так, как должны? Мысль о сигналах (относительно новых для меня), но задавался вопросом, было ли это излишним. Я, наверное, обдумываю это!

Спасибо

Ответы [ 2 ]

4 голосов
/ 10 июня 2009

С другой стороны, не стоит даже явно сохранять сумму счета. Вместо этого он может динамически пересчитываться каждый раз, когда вы запрашиваете счет.

Я думаю, что это лучшее моделирование, поскольку оно позволяет избежать избыточных и, возможно, противоречивых данных. SQL и Django достаточно умны, чтобы вычислять итоговую сумму счета без особых затрат каждый раз, когда вам это нужно. Особенно Вы не выполняете суммирование в своей программе, если используете функцию агрегирования

0 голосов
/ 10 июня 2009

Мне кажется, вам нужно явно сохранить дочерние объекты перед выполнением вычисления, поскольку ваш запрос ссылается на объекты, как в базе данных, в то время как любой измененный объект из формы может быть не сохранен вами.

...