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


Posted in Python onAugust 06, 2019

前言

从前面已经知道, 一个 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 吧.

Python 相关文章推荐
Python显示进度条的方法
Sep 20 Python
python下载文件记录黑名单的实现代码
Oct 24 Python
Python 列表理解及使用方法
Oct 27 Python
Python程序员面试题 你必须提前准备!
Jan 16 Python
python使用opencv按一定间隔截取视频帧
Mar 06 Python
python和pygame实现简单俄罗斯方块游戏
Feb 19 Python
python MNIST手写识别数据调用API的方法
Aug 08 Python
Python+selenium 获取浏览器窗口坐标、句柄的方法
Oct 14 Python
关于pandas的离散化,面元划分详解
Nov 22 Python
PyTorch 对应点相乘、矩阵相乘实例
Dec 27 Python
如何使用python传入不确定个数参数
Feb 18 Python
Python自动创建Excel并获取内容
Sep 16 Python
Django中使用session保持用户登陆连接的例子
Aug 06 #Python
Python中的self用法详解
Aug 06 #Python
django框架用户权限中的session缓存到redis中的方法
Aug 06 #Python
Django 响应数据response的返回源码详解
Aug 06 #Python
详解Python Matplotlib解决绘图X轴值不按数组排序问题
Aug 05 #Python
Django中提供的6种缓存方式详解
Aug 05 #Python
python修改字典键(key)的方法
Aug 05 #Python
You might like
Smarty安装配置方法
2008/04/10 PHP
php INI配置文件的解析实现分析
2011/01/04 PHP
PHP 设计模式之观察者模式介绍
2012/02/22 PHP
PHP静态方法和静态属性及常量属性的区别与介绍
2019/03/22 PHP
PHP设计模式之单例模式定义与用法分析
2019/03/26 PHP
javascript操作JSON的要领总结
2012/12/09 Javascript
Javascript图像处理—虚拟边缘介绍及使用方法
2012/12/27 Javascript
js获取 type=radio 值的方法
2014/05/09 Javascript
js实现将选中值累加到文本框的方法
2015/08/12 Javascript
JS实现滑动菜单效果代码(包括Tab,选项卡,横向等效果)
2015/09/24 Javascript
基于javascript制作微信聊天面板
2020/08/09 Javascript
jQuery实现日期联动效果实例
2016/07/26 Javascript
JS获取html元素的标记名实现方法
2016/10/08 Javascript
详解vue之页面缓存问题(基于2.0)
2017/01/10 Javascript
浅谈Javascript常用正则表达式应用
2019/03/08 Javascript
JS数组Object.keys()方法的使用示例
2019/06/05 Javascript
微信小程序之几种常见的弹框提示信息实现详解
2019/07/11 Javascript
javascript二维数组和对象的深拷贝与浅拷贝实例分析
2019/10/26 Javascript
VSCode写vue项目一键生成.vue模版,修改定义其他模板的方法
2020/04/17 Javascript
JS判断数组是否包含某元素实现方法汇总
2020/06/24 Javascript
Python获取单个程序CPU使用情况趋势图
2015/03/10 Python
Python运算符重载用法实例
2015/05/28 Python
深入浅析python3中的unicode和bytes问题
2019/07/03 Python
使用python对多个txt文件中的数据进行筛选的方法
2019/07/10 Python
解决python 读取excel时 日期变成数字并加.0的问题
2019/10/08 Python
Python爬取腾讯视频评论的思路详解
2019/12/19 Python
Python autoescape标签用法解析
2020/01/17 Python
python selenium操作cookie的实现
2020/03/18 Python
在Keras中实现保存和加载权重及模型结构
2020/06/15 Python
keras.utils.to_categorical和one hot格式解析
2020/07/02 Python
python 使用csv模块读写csv格式文件的示例
2020/12/02 Python
关于建议书的格式范文
2014/05/20 职场文书
小学优秀班集体申报材料
2014/05/25 职场文书
家长对学校的意见和建议
2015/06/03 职场文书
《一面五星红旗》教学反思
2016/02/23 职场文书
Mysql 文件配置解析介绍
2022/05/06 MySQL