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 随机生成中文验证码的实例代码
Mar 20 Python
python编写暴力破解FTP密码小工具
Nov 19 Python
解析Python中的生成器及其与迭代器的差异
Jun 20 Python
python3使用PyMysql连接mysql数据库实例
Feb 07 Python
Python搜索引擎实现原理和方法
Nov 27 Python
python+PyQT实现系统桌面时钟
Jun 16 Python
一步步教你用python的scrapy编写一个爬虫
Apr 17 Python
Python完全识别验证码自动登录实例详解
Nov 24 Python
pytorch中nn.Conv1d的用法详解
Dec 31 Python
django实现模型字段动态choice的操作
Apr 01 Python
Python OpenCV去除字母后面的杂线操作
Jul 05 Python
Pycharm安装python库的方法
Nov 24 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
基于mysql的bbs设计(一)
2006/10/09 PHP
php Session存储到Redis的方法
2013/11/04 PHP
PHP实现格式化文件数据大小显示的方法
2015/01/03 PHP
PHPExcel内存泄漏问题解决方法
2015/01/23 PHP
twig模板常用语句实例小结
2016/02/04 PHP
PHP定义字符串的四种方式详解
2018/02/06 PHP
Laravel监听数据库访问,打印SQL的例子
2019/10/24 PHP
判断JavaScript对象是否可用的最正确方法分析
2008/10/03 Javascript
JS 加入收藏夹的代码(主流浏览器通用)
2013/05/13 Javascript
jQuery动态创建html元素的常用方法汇总
2014/09/05 Javascript
js获取时间并实现字符串和时间戳之间的转换
2015/01/05 Javascript
JS解析XML实例分析
2015/01/30 Javascript
纯js代码实现未知宽高的元素在指定元素中垂直水平居中显示
2015/09/12 Javascript
JavaScript中Date对象的常用方法示例
2015/10/24 Javascript
JavaScript中各种引用类型的常用操作方法小结
2016/05/05 Javascript
深入理解Javascript中的valueOf与toString
2017/01/04 Javascript
JS得到当前时间的方法示例
2017/03/24 Javascript
promise处理多个相互依赖的异步请求(实例讲解)
2017/08/03 Javascript
结合mint-ui移动端下拉加载实践方法总结
2017/11/08 Javascript
微信小程序使用wxParse解析html的方法教程
2018/07/06 Javascript
react-router 路由切换动画的实现示例
2018/12/03 Javascript
python实现用类读取文件数据并计算矩形面积
2020/01/18 Python
python实现在一个画布上画多个子图
2020/01/19 Python
pycharm的python_stubs问题
2020/04/08 Python
Jupyter 无法下载文件夹如何实现曲线救国
2020/04/22 Python
CSS3中使用RGBa来调节透明度的教程
2016/05/09 HTML / CSS
P D PAOLA法国官网:西班牙著名的珠宝首饰品牌
2020/02/15 全球购物
马来西亚在线健康商店:Medipal Malaysia
2020/04/13 全球购物
外企财务年会演讲稿
2014/01/03 职场文书
绩效工资实施方案
2014/03/15 职场文书
求职意向书
2014/04/01 职场文书
高中班级口号
2014/06/09 职场文书
幼儿园清明节活动总结
2014/07/04 职场文书
致男子1500米运动员的广播稿
2019/11/08 职场文书
Mysql Show Profile
2021/04/05 MySQL
基于tensorflow权重文件的解读
2021/05/26 Python