2017-01-19 656 views
1

모델 M은 django에서 3 가지 모델에 대한 3 개의 manytomanyfields (a, b, c)를 포함합니다.dajngo, 멀티와 함께 ​​모델을 통해 m2m 신호를 변경 ManyToManyField

class M (models.Model): 
      name = models.CharField() 
      a = models.ManyToManyField(A) 
      b = models.ManyToManyField(B) 
      c = models.ManyToManyField(C) 

내가 내 모델 M에 변경 사항을 처리하고 대응 URL에 HttpRequest를을 보내려면, 알고있다. 모델 M의 사후 저장 신호에서 알 수 있듯이 모델 M 저장이 완료 될 때 설정되기 때문에 a, b 및 c에 대한 속성 값이 아직 설정되지 않았습니다. (ManyToManyField의 규칙)

I 변경 사항을 처리하기 위해 내 모델에 대한 하나의 처리기를 작성 (중 새로운 인스턴스를 생성하거나 필드/필드를 업데이트)

@receiver(post_save, sender=M) 
    @receiver(m2m_changed, sender=M.a.through) 
    @receiver(m2m_changed, sender=M.b.through) 
    @receiver(m2m_changed, sender=M.c.through) 
    def M_changes_handler(sender, **kwargs): 
      is_instance_set_compeletly(kwargs['instance']): 
       #send_and_HttpRequest(url, data = instance) 


    def is_instance_set_compeletly(kwargs['instance']): 
      if M.a.all() is not None and M.b.all() is not None and 
       M.c.all()is not None 
      flag = True 
      else: 
      flag = False 
      return flag 

이제 모든 신호를 보낼 것입니다 모델 M에 (모든 필드를 변경) 업데이트 요청을 고려 필드 a, b 및 c; 그래서 세 가지 httpRequests는 인스턴스의 세 가지 버전으로 내 보낸 사람에게 보낼 것입니다! 반면에 사용자가 모델 M의 필드 b를 변경하면이 함수는 하나의 httpRequest 만 전송합니다.

나는 누군가가 나를 :) 도움이 될 수 있다면 나는 궁금 을 M.를 동적으로이 문제를 처리하고 그냥 내 모델에 변화의 모든 종류 당 하나 개의 요청을 보낼

* 위의 코드는 단지 초안 참고 구문 오류가있어 무시하십시오.)

업데이트 : 문제가 해결되었습니다. m2mfields를 포함하는 모델을 저장하는 프로세스가 처리 중입니다! 먼저 m2m 필드가 아닌 M의 모든 입력란. post_save를 호출하기 전에 char 필드, 외래 키 등이 설정되었습니다. 따라서 post_save에서 값은 업데이트됩니다 m2mfields는 모델 저장이 완료 될 때까지 설정되지 않습니다. 그런 다음 m2mfields를 설정하기 위해 m2mfields를 호출합니다. m2mfields가 모두 설정된 후 "양식 저장"이 호출되기 때문에 admin.py의 양식 저장을 재정의하는 것이 유일한 방법입니다.

+0

예제를 추가하여 문제를 해결할 수 있습니까? –

답변

0

이전에 M의 인스턴스를 유지하고 새 M 체크 필드가있는 post_save에 요청을 보낼 수 있다고 변경되었습니다.

+0

답장을 보내 주셔서 감사합니다. 불행히도 제 경우에는 작동하지 않습니다. 왜냐하면 postmaster가 post_save 신호에 의해 수신 된 모델의 인스턴스가 postmaster가 post_save 후에 저장 될 때까지 이전 값과 동일한 값을 가지기 때문입니다! – Atefeh

0

해결 방법 : 모든 스택 오버 플로우 사용자와 친애하는 블레이크 깁스 를 들어 모델은 manytomany 필드를 포함하고 당신은 그들이이 끝난 후 절약 할 수 있기 때문에, 당신이 그 M2M 분야에 액세스 할 수 없습니다 저장된 기록의 모든 데이터에 액세스하려면 모델을 저장하는 과정 (예를 들어 M을 생각해 보자.), 그런 다음 Id를 다른 자체 생성 된 m2m 테이블에 할당하여 해당 ID를 m2m 필드에 바인딩한다 (예를 들어 A). 이 경우 admin.py에서 모델의 save 메소드를 재정의하는 것이 작동하지 않습니다. 단순히

클래스 MForm (forms.ModelForm) Forms.py에 내 양식의 저장 기능을 오버라이드 (override) :

class Meta: 
     model = M   
     exclude = [] 
def save(self, commit=True): 
    query = "" 
    old_instance = super(MForm, self).save(commit=False)# if you need the old instance 

#otherwise 반환 슈퍼 (MForm, 자기) .save (커밋 = 참)

이 경우
instance = super(MForm,self).save(commit=True) 

는 "인스턴스"정말 완전히 저장되고 사용하여 M2M 필드에 액세스 할 수 있습니다 ".ALL()"를

가 도움이 희망!