Celery任务一直认为Django模型实例是一个整数对象

时间:2014-08-08 00:37:08

标签: python django celery

我对此感到非常困惑,但也许另外一双眼睛可以提供帮助。

我将Model的primary_key传递给通过my_task.delay(args)启动的Celery任务。这是任务中的代码:

from my_project.my_app.models import *

@task()
def mytask(arg1, arg2, primary_key):
    m = Machine.objects.get(pk=primary_key)

    if m.last_os:
        last_ver = m.last_os.split('_')[1]
    else:
        last_ver = 'None'

Celery非常愤怒,我甚至会尝试这样做并吐出这个错误:

Traceback (most recent call last):
File "/Library/Python/2.7/site-packages/celery/app/trace.py", line 238, in trace_task
R = retval = fun(*args, **kwargs)
File "/Library/Python/2.7/site-packages/celery/app/trace.py", line 416, in  __protected_call__
return self.run(*args, **kwargs)
File "/Users/me/Documents/python/my_project/my_project/my_app/tasks.py", line 33, in my_task
@task()
AttributeError: 'int' object has no attribute 'last_os'

我验证传递给函数的pk确实是一个int(它的1和我正在使用django的默认pk赋值)。

另外需要注意的是,如果我自己传递了Model实例,那么一切都很好用 - 我只是宁愿没有一个可能过时的模型对象在我的Celery任务中飞行。

感谢任何帮助。

编辑:我还尝试将pk硬编码到Machine.objects.get(pk=1)调用中,并且它仍然认为它是一个整数,而我在shell中获得了一个非常好的机器实例。

1 个答案:

答案 0 :(得分:1)

事实证明,当您在Celery服务运行时编辑任务时,这些更改不会反映正在运行的Celery服务。因此,每当您更改芹菜任务的代码时,都需要重新启动Celery服务。

很遗憾,起始指南从未指明过这一点。