我在 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 中的整个 View 都在 transaction.atomic() block 中。有时 celery 运行得比事务结束时快。我想知道解决这个问题的最佳方法是什么。在调用 celery_task 时添加 eta 是我认为(或者可能不是?)的一些令人毛骨悚然的想法 - celery_task.apply_async((obj.pk,), eta=+10 seconds)
请您参考如下方法:
如果有人还在寻找这个: Django docs
from django.db import transaction
class MyModelAdmin(admin.ModelAdmin)
def save_model(self, request, obj, form, change):
super().save_model(request, obj, form, change)
if not change:
transaction.on_commit(lambda: celery_task.delay(obj.pk))
...
@app.task()
def celery_task(obj_pk):
MyModel.objects.get(pk=obj_pk)
