首页 > 解决方案 > Django 3.1 - 异步视图 - 使用查询集

问题描述

从 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中评估查询集:

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

看起来很丑

关于如何使它更好的任何想法?

标签: pythondjangoasynchronousdjango-3.1

解决方案


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

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

from asgiref.sync import sync_to_async

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

推荐阅读