Django - 尽管 dispatch_uid 创建后有多个 post_save 信号
Django - Multiple post_save signals after create despite dispatch_uid
我无法阻止 post_save 信号在创建对象后多次触发。
我的信号定义如下:
@receiver(post_save, sender=Order, dispatch_uid='post_save_order')
def post_save_order(sender, **kwargs):
instance = kwargs.get('instance')
if instance.type == 'buy':
delta = instance.quantity
else:
delta = instance.quantity * -1
Balance.update(instance.user, instance.quote_currency, delta)
信号导入到orders/apps.py
class OrdersConfig(AppConfig):
name = 'orders'
def ready(self):
super(OrdersConfig, self).ready()
import orders.signals
在 1 Order.create 之后将传递的 kwargs 打印到信号时:
{'instance': object, 'signal': signal, 'using': 'default', 'update_fields': None, 'raw': False, 'created': True}
{'instance': object, 'signal': signal, 'using': 'default', 'update_fields': None, 'raw': False, 'created': False}
很明显,在一次创建中,有 1 个 post_save 信号被触发,args created: True 和 1 with created: False。我不认为问题是信号可能被多次导入,因为我提供了一个 dispatch_uid 和一个在同一文件中定义的 post_delete 信号不会在单个文件中多次触发删除。
谁能告诉我为什么会这样?谢谢
你的信号post_save没问题,多存档触发才是问题。
据我所知,您正在保存 2 次,其中第一次创建对象,第二次更新对象,没有任何字段更改。
created
A boolean; True if a new record was created.
update_fields
The set of fields to update as passed to Model.save(),
or None if update_fields wasn’t passed to save().
我无法阻止 post_save 信号在创建对象后多次触发。
我的信号定义如下:
@receiver(post_save, sender=Order, dispatch_uid='post_save_order')
def post_save_order(sender, **kwargs):
instance = kwargs.get('instance')
if instance.type == 'buy':
delta = instance.quantity
else:
delta = instance.quantity * -1
Balance.update(instance.user, instance.quote_currency, delta)
信号导入到orders/apps.py
class OrdersConfig(AppConfig):
name = 'orders'
def ready(self):
super(OrdersConfig, self).ready()
import orders.signals
在 1 Order.create 之后将传递的 kwargs 打印到信号时:
{'instance': object, 'signal': signal, 'using': 'default', 'update_fields': None, 'raw': False, 'created': True}
{'instance': object, 'signal': signal, 'using': 'default', 'update_fields': None, 'raw': False, 'created': False}
很明显,在一次创建中,有 1 个 post_save 信号被触发,args created: True 和 1 with created: False。我不认为问题是信号可能被多次导入,因为我提供了一个 dispatch_uid 和一个在同一文件中定义的 post_delete 信号不会在单个文件中多次触发删除。
谁能告诉我为什么会这样?谢谢
你的信号post_save没问题,多存档触发才是问题。
据我所知,您正在保存 2 次,其中第一次创建对象,第二次更新对象,没有任何字段更改。
created
A boolean; True if a new record was created.
update_fields
The set of fields to update as passed to Model.save(), or None if update_fields wasn’t passed to save().