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字符串的常用操作方法小结
May 21 Python
python模拟登录并且保持cookie的方法详解
Apr 04 Python
Python实现的爬虫功能代码
Jun 24 Python
Python中矩阵库Numpy基本操作详解
Nov 21 Python
Python命令行解析模块详解
Feb 01 Python
基于python3 OpenCV3实现静态图片人脸识别
May 25 Python
使用python将大量数据导出到Excel中的小技巧分享
Jun 14 Python
Python3.0 实现决策树算法的流程
Aug 08 Python
Python正则表达式急速入门(小结)
Dec 16 Python
Django用户登录与注册系统的实现示例
Jun 03 Python
详解pycharm连接远程linux服务器的虚拟环境的方法
Nov 13 Python
一些让Python代码简洁的实用技巧总结
Aug 23 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 JSON 数据解析代码
2010/05/26 PHP
php+js iframe实现上传头像界面无跳转
2014/04/29 PHP
PHP hebrev()函数用法讲解
2019/02/21 PHP
pjblog中的UBBCode.js
2007/04/25 Javascript
基于jquery的无刷新分页技术
2011/06/11 Javascript
js对象与打印对象分析比较
2013/04/23 Javascript
基于SVG的web页面图形绘制API介绍及编程演示
2013/06/28 Javascript
利用函数的惰性载入提高javascript代码执行效率
2014/05/05 Javascript
js实现缓冲运动效果的方法
2015/04/10 Javascript
JS实现的简单拖拽功能示例
2017/03/13 Javascript
利用JS实现简单的瀑布流加载图片效果
2017/04/22 Javascript
基于JavaScript实现每日签到打卡轨迹功能
2018/11/29 Javascript
详解滑动穿透(锁body)终极探索
2019/04/16 Javascript
Vue 防止短时间内连续点击后多次触发请求的操作
2020/11/11 Javascript
Python中的二叉树查找算法模块使用指南
2014/07/04 Python
python中defaultdict的用法详解
2017/06/07 Python
5款非常棒的Python工具
2018/01/05 Python
python 解决动态的定义变量名,并给其赋值的方法(大数据处理)
2018/11/10 Python
Django的性能优化实现解析
2019/07/30 Python
pytorch在fintune时将sequential中的层输出方法,以vgg为例
2019/08/20 Python
利用python实现PSO算法优化二元函数
2019/11/13 Python
学习Python需要哪些工具
2020/09/04 Python
python实现发送邮件
2021/03/02 Python
运动鞋、街头服装、手表和手袋的实时市场:StockX
2020/11/25 全球购物
建筑公司文秘岗位职责
2013/11/29 职场文书
应届毕业生自我鉴定范文
2013/12/27 职场文书
大学学习个人的自我评价
2014/02/18 职场文书
《绿色蝈蝈》教学反思
2014/03/02 职场文书
员工试用期考核自我鉴定
2014/04/13 职场文书
户外活动总结范文
2014/04/30 职场文书
中学优秀班主任事迹材料
2014/05/01 职场文书
2015小学教师德育工作总结
2015/05/12 职场文书
工作简报怎么写
2015/07/21 职场文书
钓鱼岛事件感想
2015/08/11 职场文书
Python办公自动化之Excel(中)
2021/05/24 Python
MySQL配置主从服务器(一主多从)
2021/08/07 MySQL