Django ORM函数如何与数据库交互解析SQL?get方法实现原理是什么
原理说明
1. Generic类的作用
你看到的Generic[_T]是Python标准库提供的泛型类型标注工具,所有你贴的Generic类代码都服务于静态类型检查,不包含任何ORM业务逻辑,完全不需要从这里找get方法的实现。
它在BaseManager中仅用来做类型标注:声明get()方法返回的是和当前Manager绑定的模型类实例,不需要为每个模型的Manager单独写返回类型声明,静态检查工具(比如Pycharm内置检查、mypy)可以自动推导返回值类型。你看到的def get(self, *args: Any, **kwargs: Any) -> _T: ...也只是类型声明桩代码,不是实际的实现逻辑。
2. get()方法的实际实现路径
Django ORM的get()方法真实逻辑在django.db.models.query.QuerySet类中,BaseManager本质是QuerySet的代理层,所有Manager暴露的查询方法(get/filter/exclude等)都会转发给内部持有的QuerySet实例执行,简化调用流程如下:
BaseManager.get(*args, **kwargs) → 调用内部方法生成对应QuerySet实例 → 执行QuerySet.get(*args, **kwargs) 进入实际查询逻辑
3. get()方法的运行逻辑
QuerySet的get方法执行步骤可以简化为:
- 接收传入的查询参数,转换为对应SQL的WHERE查询条件
- 调用数据库驱动执行查询,默认会加
LIMIT 2限制,用来判断查询结果的数量是否符合要求 - 对查询返回结果做校验:
- 无匹配结果:抛出对应模型的
DoesNotExist异常 - 匹配结果≥2条:抛出
MultipleObjectsReturned异常 - 恰好匹配1条结果:将数据库返回的行数据转换为绑定的模型类实例返回
- 无匹配结果:抛出对应模型的
内容的提问来源于stack exchange,提问作者eva
相关产品推荐
相关产品推荐

