我正在用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)
...
我到底做错了什么?
2条答案
按热度按时间gcuhipw91#
我不确定,但很可能您的任务会在数据库提交之前完成,似乎
enqueue()
方法可以将您的任务添加到队列中,以便数据库有时间提交。yacmzcpb2#
解决方案是在
signal.py
上使用transaction.on_commit
:这样,我可以确定
Post
对象已保存到DB。