Django 3.1 - 异步视图 - 处理查询集

9

从3.1版本(目前为beta版)开始,Django已经支持异步视图。

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

这个例子无法正常工作——因为ORM还不具备异步准备就绪的能力。

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

你不能只使用sync_to_async与queryset,因为它们尚未被运行评估:

from asgiref.sync import sync_to_async

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

所以唯一的方法是在sync_to_async中评估queryset:

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

这看起来非常丑陋。

你有没有想过如何让它更好看?


2
无需lambda表达式:await sync_to_async(list)(User.objects.all()) - user5510840
2个回答

16

有一个常见的陷阱:Django查询集是惰性求值的(只有在开始迭代时才会发生数据库查询):

因此,应该使用评估(使用列表)来代替:

from asgiref.sync import sync_to_async

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

6
Django 4.1开始,所有QuerySets都支持async for
async def myview(request):
    users = [user async for user in User.objects.all()]
        

更多信息:link


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接