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之wxPython菜单使用详解
Sep 28 Python
python中Matplotlib实现绘制3D图的示例代码
Sep 04 Python
python使用threading获取线程函数返回值的实现方法
Nov 15 Python
python+matplotlib绘制饼图散点图实例代码
Jan 20 Python
Tensorflow 自带可视化Tensorboard使用方法(附项目代码)
Feb 10 Python
pycharm中成功运行图片的配置教程
Oct 28 Python
python去重,一个由dict组成的list的去重示例
Jan 21 Python
如何用OpenCV -python3实现视频物体追踪
Dec 04 Python
python logging添加filter教程
Dec 24 Python
你可能不知道的Python 技巧小结
Jan 29 Python
关于win10在tensorflow的安装及在pycharm中运行步骤详解
Mar 16 Python
详解使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
Apr 01 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与MySQL交互使用详解
2006/10/09 PHP
php学习 函数 课件
2008/06/15 PHP
php 搜索框提示(自动完成)实例代码
2012/02/05 PHP
Linux Apache PHP Oracle 安装配置(具体操作步骤)
2013/06/17 PHP
DWZ+ThinkPHP开发时遇到的问题分析
2016/12/12 PHP
php使用curl实现简单模拟提交表单功能
2017/05/15 PHP
php使用 readfile() 函数设置文件大小大小的方法
2017/08/11 PHP
JavaScript中的私有成员
2006/09/18 Javascript
脚本吧 - 幻宇工作室用到js,超强推荐expand.js
2006/12/23 Javascript
微信中一些常用的js方法汇总
2015/03/12 Javascript
js图片跟随鼠标移动代码
2015/11/26 Javascript
JavaScript原型及原型链终极详解
2016/01/04 Javascript
JavaScript实现弹出模态窗体并接受传值的方法
2016/02/12 Javascript
Windows 系统下设置Nodejs NPM全局路径
2016/04/26 NodeJs
ashx文件获取$.ajax()方法发送的数据
2016/05/26 Javascript
解析js如何获取css样式
2016/12/11 Javascript
利用JS hash制作单页Web应用的方法详解
2017/10/10 Javascript
解决angular双向绑定无效果,ng-model不能正常显示的问题
2018/10/02 Javascript
Vue props 单向数据流的实现
2018/11/06 Javascript
Django中URLconf和include()的协同工作方法
2015/07/20 Python
Python进阶篇之字典操作总结
2016/11/16 Python
用Python将IP地址在整型和字符串之间轻松转换
2017/03/22 Python
解决python升级引起的pip执行错误的问题
2018/06/12 Python
在Pandas中处理NaN值的方法
2019/06/25 Python
Django处理Ajax发送的Get请求代码详解
2019/07/29 Python
django foreignkey(外键)的实现
2019/07/29 Python
python线程中的同步问题及解决方法
2019/08/29 Python
Python图像处理模块ndimage用法实例分析
2019/09/05 Python
Python3.x+迅雷x 自动下载高分电影的实现方法
2020/01/12 Python
基于Python+QT的gui程序开发实现
2020/07/03 Python
python3实现简单飞机大战
2020/11/29 Python
莫斯科高科技在线商店:KremlinStore
2019/03/13 全球购物
2013年保送生自荐信格式
2013/11/20 职场文书
酒店司机岗位职责
2013/12/14 职场文书
2015年保卫科工作总结
2015/05/14 职场文书
Python中的协程(Coroutine)操作模块(greenlet、gevent)
2022/05/30 Python