Skip to main content
 首页 » 编程设计

python之在 Django Admin 中保存新对象并发送到 Celery 任务后,匹配查询不存在

2025年05月04日33lovecherry

我在 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)