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 相关文章推荐
一个检测OpenSSL心脏出血漏洞的Python脚本分享
Apr 10 Python
python使用cPickle模块序列化实例
Sep 25 Python
Python简单日志处理类分享
Feb 14 Python
Python中使用第三方库xlutils来追加写入Excel文件示例
Apr 05 Python
python操作mysql代码总结
Jun 01 Python
在Python中增加和插入元素的示例
Nov 01 Python
Python实现统计英文文章词频的方法分析
Jan 28 Python
3种python调用其他脚本的方法
Jan 06 Python
基于keras输出中间层结果的2种实现方式
Jan 24 Python
Keras load_model 导入错误的解决方式
Jun 09 Python
Python实现文件压缩和解压的示例代码
Aug 12 Python
Pandas-DataFrame知识点汇总
Mar 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
使用session判断用户登录用户权限(超简单)
2013/06/08 PHP
深入理解:XML与对象的序列化与反序列化
2013/06/08 PHP
PHP轻量级数据库操作类Medoo增加、删除、修改、查询例子
2014/07/04 PHP
PHP Warning: Module 'modulename' already loaded in问题解决办法
2015/03/16 PHP
laravel框架中视图的基本使用方法分析
2019/11/23 PHP
不安全的常用的js写法
2009/09/15 Javascript
js取两个数组的交集|差集|并集|补集|去重示例代码
2013/08/07 Javascript
Javascript简单实现可拖动的div
2013/10/22 Javascript
js判断元素是否隐藏的方法
2014/06/09 Javascript
jQuery应用之jQuery链用法实例
2015/01/19 Javascript
使用JS轻松实现ionic调用键盘搜索功能(超实用)
2016/09/06 Javascript
关于javascript的一些知识以及循环详解
2016/09/12 Javascript
js判断文件格式及大小的简单实例(必看)
2016/10/11 Javascript
jquery easyui validatebox remote的使用详解
2016/11/09 Javascript
JS绘制微信小程序画布时钟
2016/12/24 Javascript
javascript ES6中箭头函数注意细节小结
2017/02/17 Javascript
js-FCC算法-No repeats please字符串的全排列(详解)
2017/05/02 Javascript
微信小程序获取循环元素id以及wx.login登录操作
2017/08/17 Javascript
JSON 数据格式详解
2017/09/13 Javascript
vue中子组件调用兄弟组件方法
2018/07/06 Javascript
vue打包npm run build时候界面报错的解决
2020/08/13 Javascript
vue实现选中效果
2020/10/07 Javascript
零基础写python爬虫之爬虫的定义及URL构成
2014/11/04 Python
在Python的Django框架中包装视图函数
2015/07/20 Python
Python语言实现获取主机名根据端口杀死进程
2016/03/31 Python
Python字符串和字典相关操作的实例详解
2017/09/23 Python
python遍历小写英文字母的方法
2019/01/02 Python
简单了解Python读取大文件代码实例
2019/12/18 Python
远程教育心得体会
2014/01/03 职场文书
施工安全协议书范本
2014/09/26 职场文书
迟到检讨书
2015/01/26 职场文书
贫民窟的百万富翁观后感
2015/06/09 职场文书
商业计划书之服装
2019/09/09 职场文书
如何理解python接口自动化之logging日志模块
2021/06/15 Python
浅谈mysql增加索引不生效的几种情况
2021/06/23 MySQL
在redisCluster中模糊获取key方式
2021/07/09 Redis