我在我的django项目中使用芹菜。
在芹菜任务文件中,我需要导入我的模型,以便触发模型方法。 但是,我也希望我的模型能够触发某些芹菜任务。
现在我将我的模型导入芹菜,但是尝试将芹菜任务导入我的模型文件会导致导入循环和导入错误。
解决这个问题的正确方法是什么?
答案 0 :(得分:9)
我最终做的是在方法中使用导入,而不是在模型文件顶部使用常规导入。显然,我并不真的需要循环进口。我的问题是我在celery任务文件的顶部导入模型,并在模型文件的顶部导入芹菜任务。那不是必要的。通过划分导入我能够避免循环导入问题
答案 1 :(得分:4)
Celery提供send_task()
方法,允许按名称发送任务,因此无需导入任务 - 例如:
# models.py
from celery import current_app
# no need to import do_stuff from tasks because it will be sent by name
current_app.send_task('myapp.tasks.do_stuff', args=(1, 'two'), kwargs={'foo': 'bar'})
documentation中的更多内容。
答案 2 :(得分:1)
解决这些看似循环的依赖性问题的一般方法是分解可由模型和任务导入的代码。例如,您可以分解出您提到的模型方法。您的模型将导入此分解代码,任务也将如此。
答案 3 :(得分:1)
如何不使用tasks.py文件,只是将任务修饰器应用于models.py中的方法?