保存时的最大递归深度错误

时间:2013-12-15 13:52:07

标签: django django-models

我正在尝试在创建新项目后根据新创建的项目的ID更新同一模型的其他一些项目。这就是为什么我必须在保存之后这样做。但我收到了以下错误:

maximum recursion depth exceeded

item对象似乎是有效的,而for循环本身不是递归的,并且通常会遍历item个对象。引入save()会引发错误。很明显,我似乎并不完全理解save()方法的内部工作原理。感谢任何帮助。

代码:

class SimCardInTracker(models.Model):
    tracker = models.ForeignKey(Tracker)
    simcard = models.ForeignKey(SimCard)
    start = models.DateTimeField(auto_now_add=True, unique=True)
    end = models.DateTimeField(null=True, blank=True) 

    def __unicode__(self):
        return self.tracker.serial_no

    def save(self, *args, **kwargs):
        super(SimCardInTracker, self).save(*args, **kwargs)
        prev_items =  SimCardInTracker.objects.exclude(id = self.id).filter(tracker__id = self.tracker.id)
        for item in prev_items:
            item.end = datetime.datetime.now()
            item.save()

2 个答案:

答案 0 :(得分:1)

回答您的问题:当您保存SimCardInTracker实例时,它会尝试在所有其他具有相同save的实例上调用tracker。想象一下,您的实例A,B和C都与跟踪器T相关。当您致电A.save()时,您的prev_items将产生[B, C]。然后,您致电B.save()。在这里,prev_items将是[A, C],因此您最终会调用A.save()等等...您没有使用Queryset.update()来解决此问题,因为它没有调用{ {1}}。

答案 1 :(得分:0)

我想我找到了相当优雅的解决方案:

def save(self, *args, **kwargs):
    super(SimCardInTracker, self).save(*args, **kwargs)
    prev_items =  SimCardInTracker.objects.exclude(id = self.id).filter(tracker__id = self.tracker.id).update(end = datetime.datetime.now())