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 19 Python
关于Python中浮点数精度处理的技巧总结
Aug 10 Python
Python实现输出程序执行进度百分比的方法
Sep 16 Python
Python内置函数delattr的具体用法
Nov 23 Python
tensorflow实现加载mnist数据集
Sep 08 Python
pytorch permute维度转换方法
Dec 14 Python
Python不同目录间进行模块调用的实现方法
Jan 29 Python
Python简单I/O操作示例
Mar 18 Python
Python3.5面向对象编程图文与实例详解
Apr 24 Python
pandas DataFrame行或列的删除方法的实现示例
Aug 02 Python
Django ForeignKey与数据库的FOREIGN KEY约束详解
May 20 Python
Python使用OpenCV和K-Means聚类对毕业照进行图像分割
Jun 11 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与javascript的两种交互方式
2006/10/09 PHP
prototype class详解
2006/09/07 Javascript
js 屏蔽鼠标右键脚本附破解方法
2009/12/03 Javascript
JavaScript高级程序设计(第3版)学习笔记 概述
2012/10/11 Javascript
jquery实现的随机多彩tag标签随机颜色和字号大小效果
2014/03/27 Javascript
js实现从右向左缓缓浮出网页浮动层广告的方法
2015/05/09 Javascript
javascript实现10个球随机运动、碰撞实例详解
2015/07/08 Javascript
JS提示:Uncaught SyntaxError: Unexpected token ILLEGAL错误的解决方法
2016/08/19 Javascript
js实现模糊匹配功能
2017/02/15 Javascript
Angular4实现图片上传预览路径不安全的问题解决
2017/12/25 Javascript
element-ui使用导航栏跳转路由的用法详解
2018/08/22 Javascript
移动端H5页面返回并刷新页面(BFcache)的方法
2018/11/06 Javascript
配置一个vue3.0项目的完整步骤
2019/04/26 Javascript
el-select数据过多懒加载的解决(loadmore)
2019/05/29 Javascript
JQuery实现简单的复选框树形结构图示例【附源码下载】
2019/07/16 jQuery
layui的表单验证支持ajax判断用户名是否重复的实例
2019/09/06 Javascript
webpack3.0升级4.0的方法步骤
2020/04/02 Javascript
vue 解决无法对未定义的值,空值或基元值设置反应属性报错问题
2020/07/31 Javascript
详解python中字典的循环遍历的两种方式
2017/02/07 Python
Django objects.all()、objects.get()与objects.filter()之间的区别介绍
2017/06/12 Python
浅谈python中的正则表达式(re模块)
2017/10/17 Python
Python Numpy库安装与基本操作示例
2019/01/08 Python
Python TestCase中的断言方法介绍
2019/05/02 Python
Python如何用wx模块创建文本编辑器
2020/06/07 Python
购买中国最好的电子产品:Geekbuying
2018/03/13 全球购物
俄罗斯购买剧院和演唱会门票网站:Parter.ru
2019/11/09 全球购物
施工资料员岗位职责
2014/01/06 职场文书
励志演讲稿3分钟
2014/08/21 职场文书
我的大学四年规划书范文2014
2014/09/26 职场文书
机关作风建设心得体会
2014/10/22 职场文书
佛光寺导游词
2015/02/10 职场文书
幼师小班个人总结
2015/02/12 职场文书
总经理助理岗位职责范本
2015/03/31 职场文书
警示教育观后感
2015/06/17 职场文书
我的生日感言
2015/08/03 职场文书
JS轻量级函数式编程实现XDM二
2022/06/16 Javascript