在django中创建或更新模型时运行一些python函数?

时间:2014-05-07 18:50:56

标签: django django-models django-views django-signals

我希望在保存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:我目前正在做第三个适用于updateViewCreateView的工作。 但问题是在重定向之前从do_something() function返回需要花费时间。

1 个答案:

答案 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包。