Django 对象关系映射(ORM)源码详解

作者:捣乱小子 时间:2021-08-15 01:54:00 

前言

从前面已经知道, 一个 request 的到来和一个对应 response 的返回的流程, 数据处理和数据库离不开. 我们也经常在 views.py 的函数定义中与数据库打交道.

django ORM 源代码组织结构

对于数据库, django 有自己的一套 ORM(对象关系映射), 或许其他的框架可以随意更换 ORM, 但 django 不建议这么做. 因为 django 内置有很多的 model, 这些 model 无疑是用 django 内置 ORM 实现的, 如果更换后, 内置的 model 就无效了, 除非以下两个选择:

你已经吃透了 django 的 ORM, 定制自己的 ORM, 但必须用里面的规则, 比如类的属性名等等;
又或者更换自己的 ORM, 不使用 django 内置的 model.
django 是一个大而全的框架, 但大而全却又增加了它本身的负担, 使其灵活性大大降低. 所以你看, 高内聚低耦合不容易做到.

数据库本身的复杂的, 数据库操作涉及的选项有很多, 一个 ORM 也并不简单. django 数据库部分在 django.db 中实现, 在展开之前先介绍一下它的源代码文件组织:


django.db
----backends 各种数据库后端实现
 ----dummy 哑后端, 什么都不做, 定义空方法
 ----mysql mysql 实现
 ----oracle oracle 实现
 ----.....
----models 重头戏, backends 中各种数据库都是基于此实现的
 ----fields 数据库表字段实现
   ----.....
 ----sql 语句, 记录 sql 语句的各种选项, where 等, 最后生成 sql 语句; 连接数据库得到结果
   ----.....
 ----aggregates.py 聚合相关
 ----base.py 定义 Model 类
 ----constants.py 一些常量
 ----deletion.py 数据库表项的删除实现
 ----expressions.py 表达式类, where 会出现表达式
 ----loading.py
 ----manager.py ORM 的管理器
 ----options.py 数据库表选项, 譬如主键等
 ----query.py 数据库查询集类
 ----query_utils.py 小工具
 ----related.py 与`表关联`相关
 ----signals.py
 ----__init__.py

django ORM 底层的实现都在 django.db.models 中. 如你所知, 数据库操作的选项很多, 这里并不专注展开这些选项在 django ORM 中是如何实现的, 而将展开的是 django ORM 的实现的框架, 当用 django ORM 执行一个简单的查询操作时, 里面是如何工作的, 工具类之间是如何协调的. 了解这些, 使用 django ORM 会更游刃有余.

我已经在 github 备份了 Django 源码的注释: Decode-Django, 有兴趣的童鞋 fork 吧.

来源:https://www.cnblogs.com/daoluanxiaozi/p/3364649.html

标签:django,对象,关系,映射,orm
0
投稿

猜你喜欢

  • 如何使用Python快速生成gif图

    2021-08-24 18:38:43
  • 详解Python Matplotlib解决绘图X轴值不按数组排序问题

    2022-12-03 09:33:06
  • 利用Python编写个有趣的记仇本

    2022-08-25 19:20:20
  • 在keras下实现多个模型的融合方式

    2023-06-03 17:14:59
  • pandas loc iloc ix用法详细分析

    2021-08-31 20:16:53
  • Python Paramiko上传下载sftp文件及远程执行命令详解

    2021-06-20 16:35:09
  • 详解Pandas 处理缺失值指令大全

    2022-06-20 07:15:23
  • Dreamweaver4使用技巧之--为你的站点定做颜色

    2010-09-05 21:12:00
  • 在SQL Server中使用SQL语句查询一个存储过程被其它所有的存储过程引用的存储过程名

    2012-07-11 16:09:40
  • ASP 相关文章或者相关产品

    2011-03-30 11:12:00
  • 利用Python求阴影部分的面积实例代码

    2021-10-05 15:18:03
  • 手机验证设计感悟

    2011-01-20 19:55:00
  • 解决python3中os.popen()出错的问题

    2022-07-20 23:38:48
  • JavaScript入门学习书籍的阶段选择

    2008-01-11 19:39:00
  • selenium获取当前页面的url、源码、title的方法

    2022-10-01 18:34:53
  • pandas实现DataFrame显示最大行列,不省略显示实例

    2023-10-27 14:08:52
  • 快速升级MySQL系统表

    2009-01-23 12:35:00
  • asp如何在ADO中客户端利用好缓存技术?

    2010-06-17 12:50:00
  • 关于Python使用turtle库画任意图的问题

    2023-08-21 14:02:34
  • 2款Python内存检测工具介绍和使用方法

    2022-10-09 06:13:10
  • asp之家 网络编程 m.aspxhome.com