我希望在保存model
后运行一些代码。有三个地方可以做到这一点
1)覆盖保存方法:
def save(self, *args, **kwargs):
super(Blog, self).save(*args, **kwargs)
do_something()
2)使用post_save信号:
def model_created(sender, **kwargs)
the_instance = kwargs['instance']
if kwargs['created']:
do_something()
post_save.connect(model_created, sender=YourModel)
3)在视图中执行此操作。
if form.is_valid():
do_something()
return redirect(reverse("homepage"))
这三个都应该有效。这个post提倡第二个。
我的问题是第二种方法(post_save
)在首次创建模型时有效。我想在创建新模型时以及更新现有模型时调用do_something()
。
在后一种情况下,我将kwargs[
创建]
为false
。我该如何处理这种情况?
P.S:我目前正在做第三个适用于updateView
和CreateView
的工作。
但问题是在重定向之前从do_something() function
返回需要花费时间。
答案 0 :(得分:2)
post_save
信号是这三者中最干净的选择。
只需消除if kwargs['created']
并在函数正文中调用do_something()
:
def model_created_or_updated(sender, **kwargs):
the_instance = kwargs['instance']
do_something()
post_save.connect(model_created_or_updated, sender=YourModel)
现在,每次YourModel
创建或更新do_something()
都会被调用。
仅供参考,created
只是一个标志,指示是否已创建YourModel
(值为True
)或已更新(值为False
)。
请注意,do_something()
将同步执行,并且在完成之前将“阻止”。如果要异步执行do_something
,则需要使用真正的任务管理工具,例如celery
包。