Django 5.0中await QuerySet本身不合法,必须使用aget()、alist()、afilter().alist()、acount()等明确异步方法;需配置异步数据库连接工厂,且事务、select_for_update、反向prefetch等仍不支持异步。

async def 视图里直接 await QuerySet 不行
Django 5.0 的 ORM 异步支持是“有限异步”,QuerySet 本身仍不是可 await 对象。你写 await MyModel.objects.all() 会报 TypeError: object QuerySet can't be used in 'await' expression。这不是 bug,是设计使然——Django 把异步入口收口到明确的 async 方法上。
必须用以下四个方法之一才能真正触发异步查询:
-
await MyModel.objects.aget(...)(单对象) -
await MyModel.objects.aall().alist()(全量列表) -
await MyModel.objects.afilter(...).alist()(带条件) -
await MyModel.objects.acount()、aexists()等聚合/判断方法
注意:.alist() 是关键,它把惰性 AsyncQuerySet 转成实际结果列表;漏掉它就只是个未执行的协程对象。
数据库连接必须配置为 async=True
Django 默认用同步数据库连接,即使你在视图里用了 await,底层仍是阻塞式调用。必须在 settings.py 的 DATABASES 配置中显式启用异步驱动:
立即学习“Python免费学习笔记(深入)”;
DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql",
"NAME": "mydb",
"USER": "user",
"PASSWORD": "pass",
"HOST": "localhost",
"PORT": "5432",
"OPTIONS": {
"connection_factory": "django.db.backends.postgresql.async_connection.AsyncConnectionFactory",
},
}
}
只改 ENGINE 不够,PostgreSQL 必须配 AsyncConnectionFactory;SQLite 不支持异步;MySQL 需用 django.db.backends.mysql.async_connection.AsyncConnectionFactory(且要求 mysqlclient ≥ 2.2.4 或 PyMySQL + aiomysql)。
没配对连接工厂时,await 调用会静默退化为同步执行,CPU 占用可能反升——因为事件循环被阻塞,还多了一层协程调度开销。
不能在同步函数里混用 await QuerySet 方法
这是最常踩的坑:async def 视图里调用了一个普通 def 工具函数,而该函数内部写了 await MyModel.objects.aall().alist(),运行时报 RuntimeError: no running event loop。
根本原因是:Django 的异步 ORM 方法依赖当前线程存在运行中的 asyncio 事件循环,而同步函数默认不在任何 loop 中执行。
解决方案只有两个:
- 把工具函数也改成
async def,并在调用处加await - 或用
sync_to_async()包裹整个 ORM 操作(但这就失去异步意义了)
没有“局部开启 loop”这种捷径。Django 不允许在任意上下文注入事件循环,避免并发混乱。
事务和 select_for_update 在 async 下受限
目前(Django 5.0)不支持 async with transaction.atomic(),也不支持 await queryset.select_for_update().alist()。所有涉及事务控制、行锁的操作,仍必须走同步路径。
如果你的业务需要“查+锁+更新”原子性,别强行拆成 await aget + save(),这会导致竞态条件。老实用 def 视图 + 同步 ORM,或者把锁逻辑下沉到数据库层(如 INSERT ... ON CONFLICT)。
另外,prefetch_related 和 select_related 的异步版本(aprefetch_related / aselect_related)虽已存在,但仅限一对一/一对多正向关系;反向关系、自定义 through 模型仍不支持异步预取。


















