2016-06-03 25 views
1

Ich versuche, Django in einem Fall kein Signal zu senden. Beim Hinzufügen einer neuen Instanz des Modells Delivery (direkt nach dem Erstellen eines Job) als Attribut des Modells Job, möchte ich kein Signal senden, da das Signal den Administrator benachrichtigen soll, dass Job bearbeitet wurde.post_save.disconnect funktioniert überhaupt nicht

Leider kann ich es nicht funktionieren lassen.

@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) 

Wo ist das Problem? Ich habe dies getan, aber ich bekomme immer noch zwei Warnungen - New Order und Edited Order.

+1

Hat lösen das Problem hierbei http://stackoverflow.com/questions/11487128/django-temporarily-disable-signals? –

Antwort

1

Das Problem ist, dass Sie das gleiche Signal zweimal hören.

@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): 
    ### 

Du assuing dass create_delivery zuerst genannt wird. Aber das scheint nicht zu passieren. alert_admin scheint zuerst angerufen zu werden. Also was auch immer Signal deaktivieren, dass Sie in create_delivery tun, geht einfach verschwenden.

Django bietet keine Garantien oder Kontrollen über die Reihenfolge, in der Signale ausgelöst werden (what's the order of post_save receiver in django?)

Sie eine einfache Flagge zu Ihrer Instanz hinzufügen können den Signalprozessor zu sagen, dass dieses Signal nicht die weitere Verarbeitung benötigt.

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