异步视图不等于异步数据库查询,django 5.0 的 async def 视图仅升级调度层,同步 orm 调用会阻塞事件循环;必须配合 asyncpg/aiosqlite 等异步驱动及 a-prefixed 方法(如 afirst、aorder_by),且聚合、事务、表单验证等仍为同步短板。

异步视图不等于异步数据库查询
写了 async def 视图,不代表数据库操作就自动变快了。Django 5.0 的异步视图本身只是调度层的升级——它把请求交给事件循环,但一旦调用 MyModel.objects.filter().first() 这类同步 ORM 方法,整个协程就会被阻塞,事件循环卡住,其他请求全得排队等。真正释放并发能力的关键,在于让数据库 I/O 也非阻塞。
必须配对使用 asyncpg / aiosqlite 等驱动
Django 5.0 的 aget()、afirst()、acount() 等方法底层依赖数据库驱动的异步协议支持:
- PostgreSQL 必须用
asyncpg(不是psycopg),且要在settings.py中显式配置'ENGINE': 'django.db.backends.postgresql_async' - SQLite 只能用
aiosqlite,且仅限开发调试——生产环境不推荐 - MySQL 目前无官方异步驱动支持,
aiomysql社区版可用但未被 Django 官方集成,await MyModel.objects.aget()会直接报错 - 若驱动不支持异步,Django 会静默 fallback 到同步执行,你根本收不到警告
链式调用必须用 a-prefixed 方法
不能写 await MyModel.objects.filter(name__startswith='a').order_by('id').afirst()——order_by() 是同步方法,中间一调用就阻塞。正确写法是:
await MyModel.objects.filter(name__startswith='a').aorder_by('id').afirst()
注意:aorder_by、aselect_related、aprefetch_related 都是独立方法,且目前 aselect_related 和 aprefetch_related 实际仍是同步实现,调用它们会退回到线程池包装,无法真正异步。
事务和聚合仍是同步短板
哪怕驱动和 ORM 方法都配齐了,以下操作依然无法异步:
-
Sum、Avg等聚合函数没有对应aSum,annotate()内部全是同步执行 -
async with transaction.atomic()虽然语法支持,但嵌套事务或savepoint的异步语义尚未稳定,高并发下可能丢上下文 - 所有表单验证(
form.is_valid())、模板渲染(Template.render())仍是同步路径,混在异步视图里会拖慢整体响应
真正的瓶颈不在视图声明方式,而在你是否把每一段 I/O 都拆解成可 await 的原子操作,并确认每个环节都有对应的异步基础设施支撑——漏掉数据库驱动这环,前面全白搭。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











