自 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()))()
看起来很丑
关于如何让它变得更好有什么想法吗?
有一个常见的问题:Django 查询集是惰性计算的(数据库查询仅在您开始迭代时发生):
所以 - 使用评估(带列表):
from asgiref.sync import sync_to_async
async def myview(request):
users = await sync_to_async(list)(User.objects.all())
从 Django 4.1 开始,所有查询集都支持
async for
:
async def myview(request):
users = [user async for user in User.objects.all()]
更多信息:链接