Django 5.0 异步 ORM 仅支持以 a 开头的显式异步方法(如 aget()、acount()),get()、filter() 等仍是同步的;需配异步数据库驱动、禁用事务混用、避免第三方同步依赖。

async def 视图里直接调用 await Model.objects.get() 会报错
Django 5.0 的 ORM 确实支持异步查询,但不是所有 QuerySet 方法都已异步化。像 Model.objects.get()、Model.objects.filter() 这些返回 QuerySet 或模型实例的方法,本身仍是同步的——它们不返回 Awaitable,不能直接 await。
真正可 await 的是明确标注为异步的方法,比如 aget()、aall()、acount()、afirst()、alast() 等。这些方法名以 a 开头,是官方提供的异步入口。
-
await MyModel.objects.aget(id=1)✅ 可用,等价于同步的get() -
await MyModel.objects.filter(name__startswith="a").alist()✅ 返回 list -
await MyModel.objects.filter(active=True).acount()✅ 异步计数 -
await MyModel.objects.filter(...).aget()❌ 错误:QuerySet.get()不是异步方法,没有aget()是 QuerySet 的方法,不是链式调用的终点
数据库后端必须启用 async support(PostgreSQL / MySQL 8.0+)
Django 的异步 ORM 依赖底层异步驱动。SQLite 不支持异步连接,哪怕写了 await,也会在运行时降级为同步执行(并抛出警告),实际没并发收益。
PostgreSQL 推荐用 psycopg[pool](≥3.1),MySQL 推荐 mysqlclient ≥2.2.0 或 aiomysql(需额外配置)。检查你的 DATABASES 配置是否启用了异步引擎:
立即学习“Python免费学习笔记(深入)”;
DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql",
"NAME": "mydb",
"USER": "user",
"PASSWORD": "pass",
"HOST": "localhost",
"PORT": "5432",
# ✅ 必须加上这一行才能启用异步连接池
"OPTIONS": {"connection_factory": "psycopg.AsyncConnection"},
}
}
如果漏掉 OPTIONS 或用的是旧版驱动,await 调用会 fallback 到同步路径,日志里会出现 RuntimeWarning: You're using an async database backend...。
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
事务内不能混用 sync/async 查询
在一个数据库事务中,所有查询必须统一为同步或异步。Django 不允许你在 transaction.atomic() 块里先 await 一个 aget(),再调用 .save()(它是同步的)——这会触发 RuntimeError: Cannot use synchronous database operations inside async functions。
- 想在事务里用异步查询?得用
async with transaction.atomic()(Django 5.0+ 支持) -
model_instance.save()仍是同步方法;要异步保存,得用await model_instance.asave() -
await MyModel.objects.abulk_create([...])✅ 存在;但bulk_update尚无abulk_update(截至 5.0.6)
第三方包和自定义 Manager 很可能不支持异步
很多常用扩展(如 django-filter、django-rest-framework 的默认视图集、django-crispy-forms)内部仍走同步 ORM 路径。即使你写了 async def 视图,一旦调用 qs.filter(...).order_by(...) 这类链式操作,后续若没接 alist() 或 acount(),就卡在同步 QuerySet 上。
自定义 Manager 或 QuerySet 类也需显式实现异步方法。例如:
class AsyncBookQuerySet(models.QuerySet):
async def popular(self):
return await self.filter(rating__gt=4).alist()
<p>class BookManager(models.Manager):
def get_queryset(self):
return AsyncBookQuerySet(self.model, using=self._db)</p>否则 Book.objects.popular() 仍是同步调用,不会自动变成 await 友好。
异步 ORM 的边界很实在:它只覆盖了核心 CRUD 的一部分方法,且高度依赖驱动、事务上下文和周边生态的适配。别假设“加个 await 就变快”,先确认调用链每个环节都真正异步。

















