2016-06-03 4 views
1

장고가 신호를 보내지 않게하려고합니다. 모델 (Job 작성 직후)의 새 인스턴스를 모델 Job의 속성으로 추가 할 때 신호가 관리자에게 경고해야하므로 신호를 보내지 않으려 고합니다. Job이 편집되었습니다.post_save.disconnect가 전혀 작동하지 않습니다

불행히도 나는 그것을 작동시킬 수 없습니다.

@receiver(post_save,sender=Job) # When Job is created or edited 
def alert_admin(sender,instance,created,**kwargs): 
    if created: 
     email.AdminNotifications.new_order(instance) 
    else: 
     email.AdminNotifications.edited_order(instance) 

@receiver(post_save,sender=Job) # When job is created, I want to create a delivery object as an attribute of Job 
def create_delivery(sender,instance,created,**kwargs): 
    if created: 
     delivery,created_delivery = Delivery.objects.get_or_create(job=instance) 
     instance.delivery = delivery 
     delivery.save() 
     post_save.disconnect(alert_admin) 
     instance.save() # I DONT WANT TO SEND SIGNAL IN THIS CASE 
     post_save.connect(alert_admin) 

어디에서 문제가 발생합니까? 나는 이것을했다. 그러나 나는 아직도 두 개의 경고 (New OrderEdited Order)를 받는다.

+1

이렇게하면 문제가 해결됩니까? http://stackoverflow.com/questions/11487128/django-temporarily-disable-signals? –

답변

1

문제는 동일한 신호를 두 번 듣고 있다는 것입니다.

@receiver(post_save,sender=Job) # When Job is created or edited 
def alert_admin(sender,instance,created,**kwargs): 
    ### 

@receiver(post_save,sender=Job): 
def create_delivery(sender,instance,created,**kwargs): 
    ### 

당신은 create_delivery가 먼저 호출됩니다 assuing있다. 그러나 그것은 일어나지 않는 것 같습니다. alert_admin이 먼저 호출 된 것처럼 보입니다. 따라서 당신이 무능력하게하는 신호는 create_delivery에서 그냥 낭비됩니다.

장고 당신은이 신호가 추가 처리를 필요로하지 않는 신호 프로세서에게 인스턴스에 간단한 플래그를 추가 할 수 있습니다

신호가 발사되는 순서 (what's the order of post_save receiver in django?)을 통해 어떠한 보증이나 컨트롤을 제공하지 않습니다.

if hasattr(instance,'signal_processed'): 
    return 
else: 
    # do whatever processing 
    instance.signal_processed = True 
관련 문제