Django 3.1 - 异步视图 - 使用查询集

问题描述 投票:0回答:2

自 3.1(当前测试版)起,Django 支持异步视图

async def myview(request):
    users = User.objects.all()

这个示例将不起作用 - 因为 ORM 尚未准备好异步

那么当前的解决方法是什么?

你不能只将sync_to_async与查询集一起使用 - 因为它们不会被评估:

from asgiref.sync import sync_to_async

async def myview(request):
    users = await sync_to_async(User.objects.all)()

所以唯一的方法是评估sync_to_async中的查询集:

async def myview(request):
    users = await sync_to_async(lambda: list(User.objects.all()))()

看起来很丑

关于如何让它变得更好有什么想法吗?

python django asynchronous django-3.1
2个回答
16
投票

有一个常见的问题:Django 查询集是惰性计算的(数据库查询仅在您开始迭代时发生):

所以 - 使用评估(带列表):

from asgiref.sync import sync_to_async

async def myview(request):
    users = await sync_to_async(list)(User.objects.all())

4
投票

Django 4.1 开始,所有查询集都支持

async for

async def myview(request):
    users = [user async for user in User.objects.all()]
        

更多信息:链接

© www.soinside.com 2019 - 2024. All rights reserved.