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实现简单的四则运算计算器
Nov 02 Python
Python开发的HTTP库requests详解
Aug 29 Python
django用户注册、登录、注销和用户扩展的示例
Mar 19 Python
Django 登陆验证码和中间件的实现
Aug 17 Python
Python 继承,重写,super()调用父类方法操作示例
Sep 29 Python
Python迭代器iterator生成器generator使用解析
Oct 24 Python
django中间键重定向实例方法
Nov 10 Python
Python 解决OPEN读文件报错 ,路径以及r的问题
Dec 19 Python
Pytorch之contiguous的用法
Dec 31 Python
python GUI库图形界面开发之PyQt5计数器控件QSpinBox详细使用方法与实例
Feb 28 Python
python 爬取百度文库并下载(免费文章限定)
Dec 04 Python
粗暴解决CUDA out of memory的问题
May 22 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或asp创建网页桌面快捷方式的代码
2010/03/23 PHP
php数组相加 array(“a”)+array(“b”)结果还是array(“a”)
2012/09/19 PHP
php防止CC攻击代码 php防止网页频繁刷新
2015/12/21 PHP
JS增加行复制行删除行的实现代码
2013/11/09 Javascript
jquery事件重复绑定的快速解决方法
2014/01/03 Javascript
实现checkbox全选、反选、取消JavaScript小脚本异常
2014/04/10 Javascript
让人蛋疼的JavaScript语法特性
2014/09/30 Javascript
javascript实现checkBox的全选,反选与赋值
2015/03/12 Javascript
关注jquery技巧提高jquery技能(前端开发必学)
2015/11/02 Javascript
JS实现的新浪微博大厅文字内容滚动效果代码
2015/11/05 Javascript
简述JavaScript提交表单的方式 (Using JavaScript Submit Form)
2016/03/18 Javascript
JS获取鼠标相对位置的方法
2016/09/20 Javascript
jQuery实现图片滑动效果
2017/03/08 Javascript
angular过滤器实现排序功能
2017/06/27 Javascript
利用three.js画一个3D立体的正方体示例代码
2017/11/19 Javascript
在vue项目创建的后初始化首次使用stylus安装方法分享
2018/01/25 Javascript
vue-cli开发时,关于ajax跨域的解决方法(推荐)
2018/02/03 Javascript
react以create-react-app为基础创建项目
2018/03/14 Javascript
JavaScript循环遍历你会用哪些之小结篇
2018/09/28 Javascript
详解vue中使用axios对同一个接口连续请求导致返回数据混乱的问题
2019/11/06 Javascript
vue实现登录、注册、退出、跳转等功能
2020/12/23 Vue.js
twilio python自动拨打电话,播放自定义mp3音频的方法
2019/08/08 Python
Django添加bootstrap框架时无法加载静态文件的解决方式
2020/03/27 Python
CSS3用@font-face实现自定义英文字体
2013/09/23 HTML / CSS
用CSS3实现无限循环的无缝滚动的实例代码
2017/07/04 HTML / CSS
canvas需要在标签里直接定义宽高
2014/12/17 HTML / CSS
KEETSA环保床垫:更好的睡眠,更好的生活!
2016/11/24 全球购物
Wolford法国官网:奥地利奢侈内衣品牌
2020/08/11 全球购物
护理学专业推荐信
2013/12/03 职场文书
化验员岗位职责
2015/02/14 职场文书
公司员工手册范本
2015/05/14 职场文书
初中政治教师教学反思
2016/02/23 职场文书
apache基于端口创建虚拟主机的示例
2021/04/24 Servers
python基础之模块的导入
2021/10/24 Python
postman中form-data、x-www-form-urlencoded、raw、binary的区别介绍
2022/01/18 HTML / CSS
win7配置本地ftp服务器的图文教程
2022/08/05 Servers