讲师中心 微信公众号
AI工具推荐 视频效率加速

如何在Python3.11中使用Django5的纯原生异步ORM?

梦磊同学_4576

梦磊同学_4576

发布时间:2026-09-13 09:57:48

|

179人浏览过

|

来源于php中文网

原创

不会报错,前提是视图为async def且运行在ASGI环境下;否则会因上下文不匹配触发RuntimeError或SynchronousOnlyOperation异常。

如何在python3.11中使用django5的纯原生异步orm?

async def view里直接await Model.objects.aget()会报错吗?

会,但只在你没用 async def 视图、或没配好 ASGI 服务器时才报。Django 5 的原生异步 ORM(如 aget()、aall()、acount())要求调用栈全程异步:视图必须是 async def,且运行在 ASGI 模式(daphne、uvicorn 或 hypercorn),不能走 WSGI(runserver 默认是 WSGI,不支持 async ORM 调用)。

常见错误现象:SynchronousOnlyOperation: You cannot call this from an async context —— 这说明你混用了同步 ORM 方法(比如 .get())在 async 视图里,或者反过来了;RuntimeError: This method must be run in async mode —— 表明你调了 .aget(),但当前线程/协程没被 Django 标记为 async 上下文(通常是 WSGI 启动导致)。

  • 确认启动命令是 uvicorn myproject.asgi:application,不是 python manage.py runserver
  • 检查 asgi.py 是否被正确引用,且 ASGI_APPLICATION = "myproject.asgi.application" 在 settings.py 中已设置
  • 所有调用异步 ORM 的函数必须用 async def 定义,包括视图、辅助函数、管理命令的 handle_async 方法

Django 5 的 async ORM 支持哪些 QuerySet 方法?

不是所有方法都有异步版本。Django 5 提供的原生异步方法有限,集中在“终端操作”上,不支持链式异步过滤(比如 Book.objects.filter(...).aselect_related(...).afirst() 是非法的 —— filter() 本身仍是同步的,只返回普通 QuerySet)。

可用的异步方法只有这些(带 a 前缀):aget()、afirst()、alast()、acount()、aexists()、aiterator()、aupdate()、adelete()。注意:aupdate() 和 adelete() 是对整个 QuerySet 执行的,不支持 save() 的异步版本(模型实例的 asave() 在 Django 5.0 中尚未实现,要等 5.1+)。

立即学习“Python免费学习笔记(深入)”;

Django Unfold
Django Unfold

提供使用 django-unfold (v0.56+) 构建高级 Django 管理界面的专业指导。当用户提及 django-unfold、unfold admin 等内容时使用此技能。

下载
  • select_related() 和 prefetch_related() 仍是同步方法,但它们的异步等价物是 aselect_related() 和 aprefetch_related() —— 这两个是 Django 5.0 新增的,仅限于外键/一对多预取,且必须在调用终端方法前链式使用
  • values()/values_list() 没有异步版,想异步获取字典列表得先 aiterator() 再手动转
  • order_by()、filter()、exclude() 等“惰性方法”全部保持同步,只是构建 QuerySet,不触发查询

如何安全地混合同步和异步数据库操作?

不能直接在同一个 async 函数里穿插 .get() 和 .aget()。Django 的数据库连接池(基于 aiomysql / asyncpg / aiosqlite)和同步连接池(pymysql / psycopg2)完全隔离。混用会导致连接复用失败或死锁。

真正安全的做法只有两种:全链路异步,或显式切换上下文。如果你必须在 async view 里调某个遗留的同步工具函数(比如一个封装了 .raw() 的统计函数),得用 sync_to_async 包装:

from asgiref.sync import sync_to_async
<p>@sync_to_async
def legacy_sync_db_call():
return Book.objects.raw("SELECT * FROM myapp_book LIMIT 1")[0]</p><h1>在 async view 中:</h1><p>book = await legacy_sync_db_call()

但要注意:sync_to_async 本质是把同步调用扔进线程池,有额外开销;高频调用会抵消异步收益。更推荐的方式是逐步将同步逻辑重写为异步原生调用,或拆出独立同步服务进程(如 Celery worker)处理重 IO 任务。

  • 不要用 asyncio.to_thread() 替代 sync_to_async —— 后者做了 Django 上下文(如数据库连接、信号)的自动传递
  • 事务(transaction.atomic())目前不支持异步上下文,所有 aupdate()/adelete() 都是自动提交的,无法回滚;需要事务请退回同步视图
  • SQLite 的异步驱动(aiosqlite)在高并发下表现不稳定,生产环境建议用 PostgreSQL + asyncpg

为什么 await Book.objects.filter(...).afirst() 会报 AttributeError?

因为 filter() 返回的是普通 QuerySet,它没有 afirst() 方法 —— 异步方法只挂在 QuerySet 的“异步查询集”子类上,而 filter() 不会自动升级类型。你得先用 Book.objects.all().filter(...).afirst(),或者更规范地写成:

qs = Book.objects.filter(title__icontains="django")
book = await qs.afirst()  # ✅ 正确:QuerySet 实例确实有 afirst()

但注意:这行代码实际执行的是同步 filter + 异步 fetch,中间的 SQL 构建仍是同步的,只是最终查询由异步驱动发出。真正的“纯异步 ORM”指整个链路(构建 + 执行)都异步化,Django 目前只做到后者。

  • Book.objects.filter(...).aget() 是合法的,因为 aget() 是 QuerySet 的方法,不限定是否经过 filter
  • Book.objects.select_related("author").afirst() 也合法,但 select_related() 本身同步,只是为后续 afirst() 预载关联数据
  • 最易忽略的一点:模型字段的 db_column、choices 等元信息读取仍是同步的,ORM 的“元层”未异步化

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

1751

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

4524

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1729

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

26697

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3227

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3247

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

1183

2023.08.11

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

596

2023.08.10

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

20

2026.10.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn