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 是模型十进制字段。

似乎 post_save 函数处于无限循环中,不知道为什么我对所有 post_save 函数都使用了相同的格式。

有任何想法吗?

4

1 回答 1

1

您正在调用instance.save()您的 post 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 回答