2013-12-15 36 views
1

我試圖在創建新項目並基於新創建的項目的ID後更新同一模型的其他項目。這就是爲什麼我必須在保存後做到這一點。但我發現了以下錯誤:保存時的最大遞歸深度錯誤

maximum recursion depth exceeded

item對象似乎是有效的,for循環本身不是遞歸迭代,並通過item對象正常。介紹save()會引發錯誤。 Obviuosly我似乎不完全理解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

我想我找到了非常優雅的解決方案是:

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()) 
1

要回答你的問題:當您保存SimCardInTracker例如,它試圖調用save全部具有相同的其他實例tracker。假設您有實例A,B和C都與跟蹤器T相關。當您撥打A.save()時,您的prev_items將產生[B, C]。您然後致電B.save()。在這裏,prev_items將是[A, C],所以你最終打電話給A.save(),等等......你沒有使用Queryset.update()這個問題,因爲它根本不會調用Model.save()

+0

+1澄清。謝謝! –