Django和Huey任务问题,任务运行时DB中的记录不存在

ikfrs5lh  于 2023-03-20  发布在  Go
关注(0)|答案(2)|浏览(155)

我正在用Django测试Huey,发现了一个问题,任务无法在DB中找到记录。

  • 波斯特格雷斯14
  • 红迪斯7.0.5
  • Django 4
  • 与 Docker 一起使用

下面是代码:

# settings.py
USE_HUEY = env.bool("USE_HUEY", False)
HUEY = {
    "huey_class": "huey.RedisHuey", 
    "name": "huey",
    "immediate": not USE_HUEY,
    "connection": {"url": REDIS_URL},
}

# app/signals.py
@receiver(post_save, sender=Post)
def post_signal(sender, instance, **kwargs):
    from app.tasks import create_or_update_related_objects
    create_or_update_related_objects(instance.pk)

# app/tasks.py
@db_task()
def create_or_update_related_objects(object_pk):
    post = Post.objects.get(pk=object_pk)
    ...

这是运行异步任务,但我得到错误:

app.models.Post.DoesNotExist: Post matching query does not exist.

这是不正确的,有一个帖子,并且此任务正在post_save信号上运行。
奇怪的是,如果我这样做,效果很好:

@db_task()
def create_or_update_related_objects(object_pk):
    import time
    time.sleep(3)
    post = Post.objects.get(pk=object_pk)
    ...

我到底做错了什么?

gcuhipw9

gcuhipw91#

我不确定,但很可能您的任务会在数据库提交之前完成,似乎enqueue()方法可以将您的任务添加到队列中,以便数据库有时间提交。

yacmzcpb

yacmzcpb2#

解决方案是在signal.py上使用transaction.on_commit

# app/signals.py
from django.db import transaction

@receiver(post_save, sender=Post)
def post_signal(sender, instance, **kwargs):
    from app.tasks import create_or_update_related_objects
    transaction.on_commit(lambda: create_or_update_related_objects(instance.pk))

这样,我可以确定Post对象已保存到DB。

相关问题