我完全被搞糊涂了,但也许另一双眼睛能帮上忙。
我将模型的primary_key传递给通过my_task.delay(args)
启动的芹菜任务。下面是任务中的代码:
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'
芹菜很生气,因为我甚至试图这样做,吐出了这个错误:
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实例本身,一切都工作得非常好——我只是不希望有一个可能过时的模型对象在我的芹菜任务中飞来飞去。
任何帮助都是感激的。
编辑:我也试过硬编码一个pk到Machine.objects.get(pk=1)
调用,它仍然认为它是一个整数,而我在shell中得到一个完美的机器实例。
因此,当您在运行芹菜服务时编辑任务时,这些更改不会反映在运行的芹菜服务上。因此,无论何时更改芹菜任务的代码,都需要重新启动芹菜服务。