【发布时间】:2015-09-07 03:47:28
【问题描述】:
我在 Django Admin (Django 1.8) 中保存一个对象并将它们传递给 Celery Task。不幸的是,我得到了一个错误[有时!]:“匹配的查询不存在”。我知道这是事务的问题,但解决该问题的最佳方法是什么?
class MyModelAdmin(admin.ModelAdmin)
def save_model(self, request, obj, form, change):
super(MyAdmin, self).save_model(request, obj, form, change)
if not change:
celery_task.delay(obj.pk)
@app.task()
def celery_task(obj_pk):
MyModel.objects.get(pk=obj_pk)
问题是 Django Admin 中的整个视图位于 transaction.atomic() 块中。有时 celery 运行速度比交易结束时更快。我想知道解决这个问题的最佳方法是什么。我认为在调用 celery_task 时添加 eta 是一个令人毛骨悚然的想法(或者可能不是?) - celery_task.apply_async((obj.pk,), eta=+10 seconds)
【问题讨论】:
-
在这方面也许有一些有趣的链接:集成post commit hooks 的票被接受(并且还有一个指向 contrib 包的链接)。在此之前,我认为
eta以及配置重试间隔似乎并不是一个令人毛骨悚然的想法(但对其他观点感到好奇)。至少它保持简单的方式。否则,您还可以运行一些独立的作业,每隔 X 间隔检查数据库是否有新更改,并从那里触发任务。 -
为什么不尝试在
post_save信号上调用 celery 任务? -
@argaen
post_save在事务块中也被调用。