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基础教程之常用运算符
Aug 29 Python
Python实现基本数据结构中队列的操作方法示例
Dec 04 Python
Python编程pygame模块实现移动的小车示例代码
Jan 03 Python
Python实现翻转数组功能示例
Jan 12 Python
Python continue继续循环用法总结
Jun 10 Python
python实现飞机大战
Sep 11 Python
用Python PIL实现几个简单的图片特效
Jan 18 Python
python画环形图的方法
Mar 25 Python
tensorflow中tf.reduce_mean函数的使用
Apr 19 Python
解决python调用自己文件函数/执行函数找不到包问题
Jun 01 Python
编写python程序的90条建议
Apr 14 Python
解决pycharm下载库时出现Failed to install package的问题
Sep 04 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
使用php测试硬盘写入速度示例
2014/01/27 PHP
分享php分页的功能模块
2015/06/16 PHP
ThinkPHP框架使用redirect实现页面重定向的方法实例分析
2018/04/12 PHP
PDO::getAttribute讲解
2019/01/28 PHP
javascript 带有滚动条的表格,标题固定,带排序功能.
2009/11/13 Javascript
Javascript学习笔记二 之 变量
2010/12/15 Javascript
js document.write()使用介绍
2014/02/21 Javascript
WebGL利用FBO完成立方体贴图效果完整实例(附demo源码下载)
2016/01/26 Javascript
javascript将url解析为json格式的两种方法
2017/08/18 Javascript
独立部署小程序基于nodejs的服务器过程详解
2019/06/24 NodeJs
如何基于JavaScript判断图片是否加载完成
2019/12/28 Javascript
vue计算属性+vue中class与style绑定(推荐)
2020/03/30 Javascript
微信小程序仿抖音视频之整屏上下切换功能的实现代码
2020/05/24 Javascript
vue打开子组件弹窗都刷新功能的实现
2020/09/21 Javascript
javascript实现多边形碰撞检测
2020/10/24 Javascript
Python构造函数及解构函数介绍
2015/02/26 Python
编写简单的Python程序来判断文本的语种
2015/04/07 Python
python 删除非空文件夹的实例
2018/04/26 Python
Django使用redis缓存服务器的实现代码示例
2019/04/28 Python
详解python和matlab的优势与区别
2019/06/28 Python
如何在Django配置文件里配置session链接
2019/08/06 Python
python matplotlib库绘制条形图练习题
2019/08/10 Python
python 5个顶级异步框架推荐
2020/09/09 Python
几款好用的python工具库(小结)
2020/10/20 Python
5 个强大的HTML5 API 函数推荐
2014/11/19 HTML / CSS
Office DEPOT法国官网:欧迪办公用品采购
2018/01/03 全球购物
应用艺术专业个人的自我评价
2014/01/03 职场文书
2014的自我评价
2014/01/13 职场文书
小区停车场管理制度
2014/01/27 职场文书
公司拓展活动方案
2014/02/13 职场文书
诉讼代理人授权委托书
2014/10/11 职场文书
三严三实学习心得体会
2014/10/13 职场文书
2014年实习生工作总结
2014/11/27 职场文书
小学科学教学计划
2015/01/21 职场文书
房屋所有权证明
2015/06/19 职场文书
2016年校长新年寄语
2015/08/17 职场文书