我对此感到非常困惑,但也许另外一双眼睛可以提供帮助。
我将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中获得了一个非常好的机器实例。
答案 0 :(得分:1)
事实证明,当您在Celery服务运行时编辑任务时,这些更改不会反映正在运行的Celery服务。因此,每当您更改芹菜任务的代码时,都需要重新启动Celery服务。
很遗憾,起始指南从未指明过这一点。