我正在尝试在创建新项目后根据新创建的项目的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()
答案 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())