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 相关文章推荐
动态创建类实例代码
Oct 07 Python
Python(Tornado)模拟登录小米抢手机
Nov 12 Python
python在Windows下安装setuptools(easy_install工具)步骤详解
Jul 01 Python
python实现事件驱动
Nov 21 Python
python统计中文字符数量的两种方法
Jan 31 Python
解决python打不开文件(文件不存在)的问题
Feb 18 Python
Python 旋转打印各种矩形的方法
Jul 09 Python
Python 异常处理Ⅳ过程图解
Oct 18 Python
Django框架教程之中间件MiddleWare浅析
Dec 29 Python
pytorch模型预测结果与ndarray互转方式
Jan 15 Python
Python获取、格式化当前时间日期的方法
Feb 10 Python
pip安装tensorflow的坑的解决
Apr 19 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文件下载实例代码浅析
2016/08/17 PHP
php设计模式之享元模式分析【星际争霸游戏案例】
2020/03/23 PHP
PHP获取真实IP及IP模拟方法解析
2020/11/24 PHP
javascript下有关dom以及xml节点访问兼容问题
2007/11/26 Javascript
jquery ui dialog里调用datepicker的问题
2009/08/06 Javascript
js 实现无干扰阴影效果 简单好用(附文件下载)
2009/12/27 Javascript
jQuery 遍历-nextUntil()方法以及prevUntil()方法的使用介绍
2013/04/26 Javascript
jquery解析JSON数据示例代码
2014/03/17 Javascript
解析javascript中鼠标滚轮事件
2015/05/26 Javascript
jQuery入门基础知识学习指南
2015/08/14 Javascript
jquery实现点击向下展开菜单项(伸缩导航)效果
2015/08/22 Javascript
JS中的phototype详解
2017/02/04 Javascript
VUE实现日历组件功能
2017/03/13 Javascript
jQuery插件HighCharts绘制的2D堆柱状图效果示例【附demo源码下载】
2017/03/14 Javascript
bootstrap IE8 兼容性处理
2017/03/22 Javascript
详解微信小程序 登录获取unionid
2017/06/27 Javascript
AngularJS实现的获取焦点及失去焦点时的表单验证功能示例
2017/10/25 Javascript
基于vue cli重构多页面脚手架过程详解
2018/01/23 Javascript
JS实现使用POST方式发送请求
2019/08/30 Javascript
使用p5.js临摹动态图形
2019/10/23 Javascript
vue iview的菜单组件Mune 点击不高亮的解决方案
2019/11/01 Javascript
vue 获取及修改store.js里的公共变量实例
2019/11/06 Javascript
[04:11]DOTA2上海特级锦标赛主赛事首日TOP10
2016/03/03 DOTA
跟老齐学Python之从if开始语句的征程
2014/09/14 Python
Python优先队列实现方法示例
2017/09/21 Python
使用python验证代理ip是否可用的实现方法
2018/07/25 Python
python 实现矩阵上下/左右翻转,转置的示例
2019/01/23 Python
PyCharm2019安装教程及其使用(图文教程)
2019/09/29 Python
Python3 shutil(高级文件操作模块)实例用法总结
2020/02/19 Python
python读取hdfs并返回dataframe教程
2020/06/05 Python
写好求职信第一句话的技巧
2013/10/26 职场文书
2014年中班元旦活动方案
2014/02/14 职场文书
大学毕业生个人总结
2015/02/28 职场文书
《认识年月日》教学反思
2016/02/19 职场文书
2016年度师德标兵先进事迹材料
2016/02/26 职场文书
python神经网络Xception模型
2022/05/06 Python