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算法输出1-9数组形成的结果为100的所有运算式
Nov 03 Python
python+selenium实现163邮箱自动登陆的方法
Dec 31 Python
python 列表递归求和、计数、求最大元素的实例
Nov 28 Python
python虚拟环境迁移方法
Jan 03 Python
Python实现连接MySql数据库及增删改查操作详解
Apr 16 Python
解决Django一个表单对应多个按钮的问题
Jul 18 Python
python实现人机猜拳小游戏
Feb 03 Python
python GUI库图形界面开发之PyQt5滑块条控件QSlider详细使用方法与实例
Feb 28 Python
python中wx模块的具体使用方法
May 15 Python
详解如何在pyqt中通过OpenCV实现对窗口的透视变换
Sep 20 Python
Python学习工具jupyter notebook安装及用法解析
Oct 23 Python
python语言实现贪吃蛇游戏
Nov 13 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
支持php4、php5的mysql数据库操作类
2008/01/10 PHP
PHP程序61条面向对象分析设计的经验小结
2008/11/12 PHP
php设计模式 Proxy (代理模式)
2011/06/26 PHP
zf框架的数据库追踪器使用示例
2014/03/13 PHP
phpmyadmin出现Cannot start session without errors问题解决方法
2014/08/14 PHP
利用php抓取蜘蛛爬虫痕迹的示例代码
2016/09/30 PHP
Prototype Hash对象 学习
2009/07/19 Javascript
jquery 笔记 事件
2011/11/02 Javascript
Mac/Windows下如何安装Node.js
2013/11/22 Javascript
js简单实现表单中点击按钮动态增加输入框数量的方法
2015/08/18 Javascript
手机移动端实现 jquery和HTML5 Canvas的幸运大奖盘特效
2016/12/06 Javascript
jQuery实现checkbox即点即改批量删除及中间遇到的坑
2017/11/11 jQuery
vue自定义filters过滤器
2018/04/26 Javascript
JS实现的杨辉三角【帕斯卡三角形】算法示例
2019/02/26 Javascript
Vue项目history模式下微信分享爬坑总结
2019/03/29 Javascript
js实现简易计算器功能
2019/10/18 Javascript
easyUI使用分页过滤器对数据进行分页操作实例分析
2020/06/01 Javascript
Element InputNumber计数器的使用方法
2020/07/27 Javascript
[02:32]DOTA2亚洲邀请赛 VG战队巡礼
2015/02/03 DOTA
[02:28]DOTA2亚洲邀请赛 LGD战队巡礼
2015/02/03 DOTA
[42:24]完美世界DOTA2联赛循环赛 LBZS vs DM BO2第一场 11.01
2020/11/02 DOTA
使用python和Django完成博客数据库的迁移方法
2018/01/05 Python
python针对不定分隔符切割提取字符串的方法
2018/10/26 Python
自定义Django Form中choicefield下拉菜单选取数据库内容实例
2020/03/13 Python
Python Tornado实现WEB服务器Socket服务器共存并实现交互的方法
2020/05/26 Python
彻底搞懂python 迭代器和生成器
2020/09/07 Python
PyChon中关于Jekins的详细安装(推荐)
2020/12/28 Python
Bloomingdale’s阿联酋:选购奢华时尚、美容及更多
2020/09/22 全球购物
人力资源管理专业自荐书范文
2014/02/10 职场文书
幼儿园保育员岗位职责
2014/04/13 职场文书
四风问题个人对照检查剖析材料
2014/09/27 职场文书
2015毕业生自我评价范文
2015/03/02 职场文书
工商行政处罚决定书
2015/06/24 职场文书
小学教师教学随笔
2015/08/14 职场文书
《童年的发现》教学反思
2016/02/18 职场文书
解决Oracle数据库用户密码过期
2022/05/11 Oracle