芹菜任务完成后更新Django模型对象

芹菜任务完成后更新Django模型对象,django,celery,django-celery,Django,Celery,Django Celery,我想在芹菜任务完成后更新模型对象。不过,我现在不知道该怎么做 这是文件的布局 models.py tasks.py 有另一面,以便可以轻松更新模型。文档中有一个示例: 请参阅垃圾邮件过滤器任务: 您正在执行循环导入。您的tasks.py文件正在导入您的models.py文件,反之亦然。您应该将信号移动到一个单独的signals.py文件以避免它。您是否尝试过将模型主键作为参数之一传递给任务的run方法,并将模型更新为run方法中的最后一行?我尝试过传递主键。但是,在我的tasks.py文件中,

我想在芹菜任务完成后更新模型对象。不过,我现在不知道该怎么做

这是文件的布局

models.py tasks.py
有另一面,以便可以轻松更新模型。

文档中有一个示例:

请参阅垃圾邮件过滤器任务:


您正在执行循环导入。您的
tasks.py
文件正在导入您的
models.py
文件,反之亦然。您应该将信号移动到一个单独的
signals.py
文件以避免它。

您是否尝试过将模型主键作为参数之一传递给任务的
run
方法,并将模型更新为
run
方法中的最后一行?我尝试过传递主键。但是,在我的
tasks.py
文件中,我无法从photo.models导入photo中执行
。您的所有工作人员是否都在同一台机器上?可能是循环依赖关系。。。你想从你的模型文件中创建任务吗?天哪。。。现在是同一台机器了。但在未来,它将是不同的机器。这看起来不错。是否有关于设置芹菜以修改dispatchers数据库的更详细指南?一旦加载了设置,您就可以从项目中导入并像在项目中一样操作它(前提是适当修改了
sys.path
)。
signals.py
文件应该放在哪里?在应用程序中还是在项目中?然后应该导入什么
signals.py
文件呢?简单的方法是,让模型导入信号,然后导入任务,然后导入模型,这样仍然可以循环导入。如果不直接通过模型注册信号处理程序,那么什么是可靠的方法?或者你会如何打破(3路而不是2路)循环导入?进一步研究项目结构,以避免模型信号触发的依赖于模型的任务的循环导入。还要注意有关传递
dispatch\u uid
参数以防止重复信号的注释。当然,文档示例中的
spam\u filter
任务会在任务完成时更新注释实例,这就是问题所在。
from photos.tasks import photo_download

class Photo(models.Model):
    ....fields....


@receiver(post_save)
def download_photo_callback(sender, **kwargs):
    photo = kwargs["instance"]
    result = photo_download.delay(photo.uid)
from photo.models import Photo

@task()
def photo_download(photo_uid, callback=None):
    ...do stuff...
    photo.status = 'D'
    photo.save()