不能从异步上下文调用它 - 使用线程或sync_to_async。Django ORM

You cannot call this from an async context - use a thread or sync_to_async. Django ORM

提问人:Sander Bakker 提问时间:10/29/2023 最后编辑:Sander Bakker 更新时间:10/29/2023 访问量:34

问:

我写了以下代码:

class BookmakerA:
    def __init__(self) -> None:
        self.bookmaker = None 
        
    async def _init(self):
        self.bookmaker, _ = await Bookmaker.objects.aget_or_create(name="BookmakerA", defaults={"name": "BookmakerA"})

我从一个 Celery 任务调用这个类,如下所示:

@shared_task
def get_bookmaker_matches(): 
    start = time.time()

    bookmakera = BookmakerA() 
    
    loop = asyncio.new_event_loop()
    asyncio.set_event_loop(loop)
    
    loop.run_until_complete(bookmakera._init())

但是,这会导致以下错误:

django.core.exceptions.SynchronousOnlyOperation: You cannot call this from an async context - use a thread or sync_to_async.

为什么会发生这种情况,我该如何解决。

即使我这样说:

await sync_to_async(Bookmaker.objects.get_or_create, thread_sensitive=True)(name="BookmakerA", defaults={"name": "BookmakerA"})

它会导致相同的错误

使用支持异步 ORM 的 Django 4.2.6(acreate_or_create、aget 等)

python django 异步 python-asyncio

评论

0赞 Paul Cornelius 10/29/2023
这回答了你的问题吗?Django:SynchronousOnlyOperation:你不能从异步上下文调用它 - 使用线程或sync_to_async
0赞 Sander Bakker 10/29/2023
@PaulCornelius 没有。尝试了所有这些,但仍然以相同的异常结束

答: 暂无答案