gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:24:56 25 4
gpt4 key购买 nike

我想在保存我的模型后运行一些代码。三个地方可以做到这一点

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)在 View 本身中执行此操作。

if form.is_valid():
do_something()
return redirect(reverse("homepage"))

这三个都应该有效。这个post主张第二种。

我的问题是,第二种方法 (post_save) 在模型首次创建时有效。我想在创建新模型以及更新现有模型时调用 do_something() 。在后一种情况下,我会将 kwargs[created] 设置为 false。我该如何处理这种情况?

P.S:我目前正在做第三个,它对于 updateViewCreateView 都可以正常工作。但问题是在重定向之前从 do_something() 函数返回需要一些时间。

最佳答案

post_save signal 是这三个选项中最干净的选项。

只需消除 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)或已更新(值为 错误)。

请注意,do_something() 将同步执行,并且在完成之前将“阻塞”。如果你想异步执行do_something,你需要使用一个真正的任务管理工具,比如 celery包。

关于django - 每当在 django 中创建或更新模型时运行一些 python 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23525936/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com