2013-12-15 3 views
1

새 항목을 생성하고 새로 만든 항목의 ID를 기반으로 동일한 모델의 다른 항목을 업데이트하려고합니다. 그래서 나는 구원 후에 그것을해야만합니다. 그러나 나는 다음과 같은 오류를 받고 있어요 :저장시 최대 재귀 깊이 오류가 발생했습니다.

maximum recursion depth exceeded

item 객체는 유효한 것으로 보인다 및 루프 자체에 대한 일반적으로 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. 감사! –

관련 문제