2010-02-04 1 views
2

을 저장 한 후 접근 ManyToManyField 개체를. 그러나 송장을 열어 다시 저장하면 변경됩니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?장고 다음 내 모델을 저장하면,이 책의 목적은 변경되지 않습니다 ...이 나를 이해할 수없는됩니다

class Invoice(models.Model): 
    ... 
    books = models.ManyToManyField(Book,blank=True,null=True) 
    ... 

    def save(self, *args, **kwargs): 
     super(Invoice, self).save(*args, **kwargs) 
     for book in self.books.all(): 
      book.quantity -= 1 
      if book.quantity == 0: 
       book.sold = True; 
      book.save() 

편집 : 나는 post_save 신호를 사용하여 시도했지만,이 같은 방식으로 작동합니다. 첫 번째 저장시 변경 사항이 없으며 변경 사항은 두 번째 저장됩니다.

는 업데이트 :이 코드를 해결해야 할 것 같습니다 :

모델은 저장 한 후 M2M 관계는 부모 개체의 PK를 얻기 위해, 저장되기 때문에입니다
class InvoiceAdmin(admin.ModelAdmin): 
    ... 

    def save_model(self, request, obj, form, change): 
     obj.save() 
     for bk in form.cleaned_data['books']: 
      book = Book.objects.get(pk=bk.id) 
      book.quantity -= 1 
      if book.quantity == 0: 
       book.sold = True; 
      book.save() 
+0

는 내가 재 설계에 대해 생각하는 것입니다. 송장을 변경해야한다면 어떤 일이 일어날 지 의도 한대로 작동했다고해도? 네가 그것을 구할 때 책이 두 번 판매 된 것처럼 보일 것이다. –

+0

네, 사실입니다 : 내 연구의 두 번째 부분은 이미 저장되어 있는지 확인하기 위해 instance_id을 추적 ... 내가 필요로 그냥 뭐 수 있습니다 장고 1.2에서 m2m_changed 생각 ... – tufelkinder

답변

4

이것은 내가이 주위에 참으로 이해할 수없는 행동을했다 방법이다. models.signals.m2m_changed 이벤트에 신호 수신기를 연결하십시오. 이것은 m2m 필드가 변경 될 때마다 트리거됩니다. 인라인 코멘트는 이유를 설명합니다.

class Gig(models.Model): 
    def slugify(self): 
     # Add venue name, date and artists to slug 
     self.slug = slugify(self.venue.name) + "-" 
     self.slug += self.date.strftime("%d-%m-%Y") + "-" 
     self.slug += "-".join([slugify(artist.name) for artist in self.artists.all()]) 
     self.save() 


@receiver(models.signals.m2m_changed, sender=Gig.artist.through) 
def gig_artists_changed(sender, instance, **kwargs): 
    # This callback function get's called twice. 
    # 1 first change appears to be adding an empty list 
    # 2nd change is adding the actual artists 
    if instance.artist.all() and not instance.slug:                                        
     instance.slugify() 
1

. 귀하의 경우, 두 번째 저장은 예상대로 작동합니다. 모델에 PK 및 관련 서적이 처음 저장되어 있기 때문에 (신호에서 완료되었습니다).

는 아직 해결책을 찾지 못한

, 가장 좋은 것 같아요, 변경 in admin view을하는 것입니다.

+0

나는 그들이 후에 저장 거 알아 모델 저장, 왜 내가 슈퍼() 후 절을 넣어. save() 그들은 post_save 신호 후에 저장됩니까? 그들이 구원받을 때를위한 신호가 있습니까? – tufelkinder

+0

Invoice.save() 호출 후에 저장되므로 부모 저장 후에도 m2m 저장되지 않습니다. 신호에 관해서는 m2m_saved을 보면 –

+0

하지만 m2m 필드를 저장하기 위해 저장 한 후 어떤 함수가 호출되는지 궁금합니다. 대신 해당 입력란을 재정의 할 수 있습니까? – tufelkinder

관련 문제