python - 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()))()
看起来很丑
关于如何使它更好的任何想法?
解决方案
有一个常见的 GOTCHA:Django 查询集是惰性求值的(数据库查询仅在您开始迭代时发生):
所以改为 - 使用评估(带列表):
from asgiref.sync import sync_to_async
async def myview(request):
users = await sync_to_async(list)(User.objects.all())
推荐阅读
- python - 您如何使用 bscscan 访问历史交易和买/卖订单?
- php - Laravel Eloquent 仅从地点中提取类别
- prometheus - Prometheus UI 间歇性地抛出警告
- laravel - App 的返回值必须是实例 Laravel 错误
- python - 根据字符串输入调用方法
- php - 如何从 php 中的当前会话中获取 csv 文件?
- python - Python Beautiful Soup - AttributeError: 'NoneType' 对象没有属性 'find_all'
- telegram - 使用 python-telegram-bot API,如何创建测试,我使用 fake-user-bots 在群聊中输入命令并让我的机器人实例响应
- hierarchical-clustering - 使用共生相关比较两个数据集上的层次聚类
- python - 如何在视图中使用扩展的功能?