1

post_save関数が返される理由を理解するのに苦労しています。

Exception Type:     RuntimeError
Exception Value:    maximum recursion depth exceeded

これが私のコードです:

#post save functions of the order
def orderPs(sender, instance=False, **kwargs):
    if instance.reference is None:
        instance.reference = str(friendly_id.encode(instance.id))

    #now update the amounts from the order items
    total = 0
    tax = 0
    #oi = OrderItem.objects.filter(order=instance)
    #for i in oi.all():
    #    total += i.total
    #    tax += i.total_tax

    instance.total = total
    instance.tax = tax
    instance.save()


#connect signal
post_save.connect(orderPs, sender=Order)

今のところ、注文アイテムのコードをコメントアウトしました。

instance.totalとinstance.taxは、モデルの10進フィールドです。

post_save関数が無限ループになっているようですが、すべてのpost_save関数に同じ形式を使用した理由はわかりません。

何か案は?

4

1 に答える 1

1

ポストセーブシグナルを呼び出しinstance.save()ているため、再帰的にトリガーされます。

この信号受信機で編集したすべてのフィールドは、データベースにすでに保存されている他の値から非常に単純に導出されるため、冗長性が作成されます。これは通常、良い考えではありません。代わりに、プロパティまたはキャッシュされたプロパティを書き込みます。

from django.db.models import Sum
from django.utils.functional import cached_property

class Order(model.Model):
    ...
    @cached_property       # or @property
    def total(self):
         return self.orderitem_set.aggregate(total_sum=Sum('total'))['total_sum']

    # do the same with tax
于 2012-06-05T01:58:49.840 に答える