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 06 Python
python3 破解 geetest(极验)的滑块验证码功能
Feb 24 Python
Python爬虫实现(伪)球迷速成
Jun 10 Python
Python 删除整个文本中的空格,并实现按行显示
Jul 24 Python
python实现石头剪刀布程序
Jan 20 Python
详解numpy.meshgrid()方法使用
Aug 01 Python
python动态文本进度条的实例代码
Jan 22 Python
Pytorch通过保存为ONNX模型转TensorRT5的实现
May 25 Python
基于Python 的语音重采样函数解析
Jul 06 Python
Django后端分离 使用element-ui文件上传方式
Jul 12 Python
numpy实现RNN原理实现
Mar 02 Python
Python中使用subprocess库创建附加进程
May 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
解析Extjs与php数据交互(增删查改)
2013/06/25 PHP
PHP7正式版测试,性能惊艳!
2015/12/08 PHP
浅谈PHP中关于foreach使用引用变量的坑
2016/11/14 PHP
弹出广告特效代码(一个IP只弹出一次)
2007/05/11 Javascript
jquery 事件冒泡的介绍以及如何阻止事件冒泡
2012/12/25 Javascript
js实现div的切换特效上一个下一个
2014/02/11 Javascript
js判断设备是否为PC并调整图片大小
2014/02/12 Javascript
jQuery的load()方法及其回调函数用法实例
2015/03/25 Javascript
javascript弹出窗口实现代码
2015/11/12 Javascript
JavaScript实现弹出DIV层同时页面背景渐变成半透明效果
2016/03/25 Javascript
jQuery EasyUI API 中文帮助文档和扩展实例
2016/08/01 Javascript
AngularJS实现按钮提示与点击变色效果
2016/09/07 Javascript
AugularJS从入门到实践(必看篇)
2017/07/10 Javascript
Angular弹出模态框的两种方式
2017/10/19 Javascript
vue watch深度监听对象实现数据联动效果
2018/08/16 Javascript
利用原生的JavaScript实现简单拼图游戏
2018/11/18 Javascript
微信小程序 JS动态修改样式的实现方法
2018/12/16 Javascript
手把手教您实现react异步加载高阶组件
2020/04/07 Javascript
React+EggJs实现断点续传的示例代码
2020/07/07 Javascript
[06:53]2018DOTA2国际邀请赛寻真——勇于创新的Vici Gaming
2018/08/14 DOTA
Python 基础教程之包和类的用法
2017/02/23 Python
Python使用内置json模块解析json格式数据的方法
2017/07/20 Python
Python数据分析库pandas基本操作方法
2018/04/08 Python
Python设计模式之装饰模式实例详解
2019/01/21 Python
django url到views参数传递的实例
2019/07/19 Python
记一次pyinstaller打包pygame项目为exe的过程(带图片)
2020/03/02 Python
python实现坦克大战
2020/04/24 Python
详解canvas绘制多张图的排列顺序问题
2019/01/21 HTML / CSS
中国首家奢侈品O2O网购平台:第五大道奢侈品网
2017/12/14 全球购物
服装设计专业自荐书范文
2013/12/30 职场文书
《和我们一样享受春天》教学反思
2014/02/07 职场文书
机关党员2014全国两会学习心得体会
2014/03/10 职场文书
小学生中国梦演讲稿
2014/04/23 职场文书
2015年中学元旦晚会活动方案
2014/12/09 职场文书
英文投诉信格式
2015/07/03 职场文书
企业廉洁教育心得体会
2016/01/20 职场文书