2014-10-21 1 views
7

나는 Django의 신호에 익숙하지 않아 도움이 될 수 있습니다.장고의 m2m_changed를 사용하여 저장 내용 수정하기 pre_add

인스턴스를 저장하기 전에 pk_set을 어떻게 수정합니까? 신호 발신자에게 뭔가를 돌려줘야합니까 (kwargs과 같은)? 또는 instance 자신을 저장합니까?

단순화 된 예 : pk=1의 범주가 저장 될 때 모든 내 비디오에 포함되도록하고 싶었습니다. m2m_changed으로 어떻게 처리 할 수 ​​있습니까?

class Video(models.Model): 
    category = models.ManyToManyField('Category') 

def video_category_changed(sender, **kwargs): 
    action = kwargs.pop('action', None) 
    pk_set = kwargs.pop('pk_set', None) 
    instance = kwargs.pop('instance', None) 

    if action == "pre_add": 
     if 1 not in pk_set: 
      pk_set.update([ 1 ]) # adding this to the set 
      # do something else? 
      # profit? 

m2m_changed.connect(video_category_changed, sender=Video.category.through) 
+1

신호에서 값을 반환 할 필요는 없습니다. 또한 인스턴스를 저장할 필요가 없습니다. 선택한 이벤트에 대한 응답으로 실행될 코드를 추가하기 만하면됩니다. – mvillaress

답변

16

그냥 pk_set을 업데이트하는 것으로 충분합니다. 추가 작업을 할 필요가 없습니다. 비디오 인스턴스가 저장되면 pk = 1 인 카테고리가 생깁니다.

from django.db import models 
from django.db.models.signals import m2m_changed 
from django.dispatch import receiver 

class Category(models.Model): 
    pass 

class Video(models.Model): 
    category = models.ManyToManyField('Category') 

@receiver(m2m_changed, sender=Video.category.through) 
def video_category_changed(sender, **kwargs): 
    action = kwargs.pop('action', None) 
    pk_set = kwargs.pop('pk_set', None)  
    if action == "pre_add": 
     if 1 not in pk_set: 
      pk_set.update([1]) 

위의 방법에서 카테고리는 비디오 인스턴스를 저장 한 후에 만 ​​저장됩니다. m2m_changed 인스턴스에이를 명시 적으로 저장하려면 다음과 같이 수행 할 수도 있습니다.

+1

가끔은 작은 것들이 당신을 가끔 우회하는 것은 재미 있습니다 - 나는 이것을 테스트 할 때'pk = 1' 카테고리 객체를 가지고 있지 않았습니다 ... 그래서 작동하지 않을 때 나는 신호로 뭔가를 놓쳤다 고 가정했습니다. 제가 처음으로 그 사람들과 함께 일한 것은 처음입니다. 사실, 저는 어리석기 만하고 처음부터 제대로 할 수있었습니다. 예를 들어 명확한 답변을 주셔서 감사합니다. 그것을 찔렀다. – thornomad

+0

도움이되었지만, 두 번 저장하면 영향을받을 수밖에 없었습니다 ... – Ycon

관련 문제