Django&芹菜 - 访问post_save数据

时间:2017-09-19 19:22:39

标签: python django celery

我有一个Celery任务,我试图通过post_save信号调用。

信号是:

@receiver(post_save, sender='foo.ModelClass')
def execute_after_save(sender, instance, created, *args, **kwargs):
    special_task.apply_async(kwargs={'bar': instance.pk}, countdown=5)

任务是:

@app.task(bind=True)
def special_task(bar, *args, **kwargs):
    bar = ModelClass.objects.select_for_update().get(pk=bar)
    print('Bar attribute: %s' % bar.attribute)

通过此迭代,我收到错误special_task() got multiple values for argument 'bar'。在迭代中我只将instance.pk作为arg发送,我得到一个TypeError,说我需要传递一个整数。当我的信号看起来像:

@receiver(post_save, sender='foo.ModelClass')
def execute_after_save(sender, instance, created, *args, **kwargs):
    special_task.apply_async(args=(instance.pk,), countdown=5)

我收到错误,说明具有该属性DoesNotExist的ModelClass。

我已经查看了其他有关此问题的问题,但我仍然遇到同样的错误。在Python 3.5上使用Django 1.11.4,Celery 3.1.25。

此任务最终尝试选择新保存的ModelClass,对其执行其他工作,然后再次保存。我怎么能这样做?

[编辑:这是我的堆栈跟踪:]

[2017-09-19 12:31:01,275: ERROR/MainProcess] Task projectname.foo.tasks.special_task[476904d9-78ed-489f-a47e-2c38fe8c64c9] raised unexpected: TypeError("special_task() got multiple values for argument 'bar'",)
Traceback (most recent call last):
  File "/home/brandon/projects/python/lib/python3.5/site-packages/celery/app/trace.py", line 240, in trace_task
R = retval = fun(*args, **kwargs)
  File "/home/brandon/projects/python/lib/python3.5/site-packages/celery/app/trace.py", line 438, in __protected_call__
return self.run(*args, **kwargs)
TypeError: special_task() got multiple values for argument 'bar'

1 个答案:

答案 0 :(得分:1)

根据您提供的最新追溯,当您使用bind=True时,任务的第一个参数应为self,请参阅Bound tasks

@app.task(bind=True)
def special_task(self, bar, *args, **kwargs):
    bar = ModelClass.objects.select_for_update().get(pk=bar)
    print('Bar attribute: %s' % bar.attribute)