post_save.disconnect 根本不起作用
post_save.disconnect does not work at all
我试图让 Django 在一种情况下不发送信号。添加模型 Delivery
的新实例(在创建 Job
之后)作为模型 Job
的属性时,我不想发送信号,因为信号应该提醒管理员 Job
已被编辑。
不幸的是,我做不到。
@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 Order
和 Edited Order
.
问题是您正在收听同一个信号两次。
@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
将首先被调用。但这似乎并没有发生。 alert_admin
似乎最先被调用。因此,您在 create_delivery
中所做的任何禁用信号都只是浪费。
Django 不对触发信号的顺序提供任何保证或控制 (what's the order of post_save receiver in django?)
您可以向您的实例添加一个简单的标志,以告知信号处理器该信号不需要进一步处理。
if hasattr(instance,'signal_processed'):
return
else:
# do whatever processing
instance.signal_processed = True
我试图让 Django 在一种情况下不发送信号。添加模型 Delivery
的新实例(在创建 Job
之后)作为模型 Job
的属性时,我不想发送信号,因为信号应该提醒管理员 Job
已被编辑。
不幸的是,我做不到。
@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 Order
和 Edited Order
.
问题是您正在收听同一个信号两次。
@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
将首先被调用。但这似乎并没有发生。 alert_admin
似乎最先被调用。因此,您在 create_delivery
中所做的任何禁用信号都只是浪费。
Django 不对触发信号的顺序提供任何保证或控制 (what's the order of post_save receiver in django?)
您可以向您的实例添加一个简单的标志,以告知信号处理器该信号不需要进一步处理。
if hasattr(instance,'signal_processed'):
return
else:
# do whatever processing
instance.signal_processed = True