ohn*_*oes 4 python django django-signals
我为我的模型编写了一些智能通用计数器和管理器(以避免select count
查询等).因此,我为post_save做了一些重要的逻辑.
我想在没有必要的时候阻止处理信号.我想完美的界面将是:
instance.save(dispatch_signal=False)
Run Code Online (Sandbox Code Playgroud)
我怎么能做到这一点?
更新
有关我正在做什么的更多信息,如果有人感兴趣:
希望它足够清楚.请原谅我的语言错误.
Сыч*_*Сыч 14
一个快速而肮脏的解决方案是:
from django.db.models.signals import post_save
from somewhere_in_my_app import my_post_save_handler
post_save.disconnect(my_post_save_handler)
instance.save()
post_save.connect(my_post_save_handler)
Run Code Online (Sandbox Code Playgroud)
但是,我强烈建议将您的逻辑转移到save()
模型的方法中.
Izz*_*sin 14
您可以断开并重新连接信号.尝试使用with:
此实用程序类的语句:
class SignalBlocker(object):
def __init__(self, signal, receiver, **kwargs):
self.signal = signal
self.receiver = receiver
self.kwargs = kwargs
def __enter__(self, *args, **kwargs):
self.signal.disconnect(self.receiver)
def __exit__(self, *args, **kwargs):
self.signal.connect(self.receiver, **self.kwargs)
Run Code Online (Sandbox Code Playgroud)
您现在可以使用:
with SignalBlocker(post_save, my_post_save_handler):
instance.save()
Run Code Online (Sandbox Code Playgroud)
Ser*_*kin 12
我找到了简单易用的解决方案:
MyModel.objects.filter(pk=instance.id).update(**data)
Run Code Online (Sandbox Code Playgroud)
这是由于(https://docs.djangoproject.com/en/1.5/ref/models/querysets/#update):
最后,意识到update()在SQL级别进行更新,因此不会在模型上调用任何save()方法,也不会发出pre_save或post_save信号(这是调用Model.save的结果) )).
归档时间: |
|
查看次数: |
3917 次 |
最近记录: |