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 相关文章推荐
用map函数来完成Python并行任务的简单示例
Apr 02 Python
Windows下实现Python2和Python3两个版共存的方法
Jun 12 Python
深入剖析Python的爬虫框架Scrapy的结构与运作流程
Jan 20 Python
python中的字典操作及字典函数
Jan 03 Python
python 重定向获取真实url的方法
May 11 Python
python3使用SMTP发送HTML格式邮件
Jun 19 Python
python编程使用协程并发的优缺点
Sep 20 Python
Python3对称加密算法AES、DES3实例详解
Dec 06 Python
基于python实现FTP文件上传与下载操作(ftp&sftp协议)
Apr 01 Python
Tensorflow实现将标签变为one-hot形式
May 22 Python
Python中SQLite如何使用
May 27 Python
Python根据指定文件生成XML的方法
Jun 29 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 分页类(模仿google)-面试题目解答
2009/09/13 PHP
通用PHP动态生成静态HTML网页的代码
2010/03/04 PHP
PHP获取MAC地址的函数代码
2011/09/11 PHP
PHP使用Memcache时模拟命名空间及缓存失效问题的解决
2016/02/27 PHP
PHP生成静态HTML文档实现代码
2016/06/23 PHP
php使用yield对性能提升的测试实例分析
2019/09/19 PHP
Laravel框架实现即点即改功能的方法分析
2019/10/31 PHP
Javascript 文件夹选择框的两种解决方案
2009/07/01 Javascript
JQuery入门——用one()方法绑定事件处理函数(仅触发一次)
2013/02/05 Javascript
javascript中打印当前的时间实现思路及代码
2013/12/18 Javascript
怎么判断js脚本加载完成
2014/02/28 Javascript
Jquery api 速查表分享
2015/01/12 Javascript
jQuery选择器源码解读(八):addCombinator函数
2015/03/31 Javascript
jQuery获得子元素个数的方法
2015/04/14 Javascript
利用jQuery插件imgAreaSelect实现图片上传裁剪(放大缩小)
2016/12/02 Javascript
基于Vue.js实现tab滑块效果
2017/07/23 Javascript
原生JS+CSS实现炫酷重力模拟弹跳系统的登录页面
2017/11/01 Javascript
vue axios请求频繁时取消上一次请求的方法
2018/11/10 Javascript
jquery实现商品sku多属性选择功能(商品详情页)
2019/12/20 jQuery
JavaScript进阶(四)原型与原型链用法实例分析
2020/05/09 Javascript
Django读取Mysql数据并显示在前端的实例
2018/05/27 Python
对python cv2批量灰度图片并保存的实例讲解
2018/11/09 Python
Python3.5实现的罗马数字转换成整数功能示例
2019/02/25 Python
安装多个版本的TensorFlow的方法步骤
2020/04/21 Python
解决pycharm不能自动保存在远程linux中的问题
2021/02/06 Python
在线学习西班牙语、法语或其他语言:Babbel.com
2018/02/07 全球购物
澳洲在线厨具商店:Kitchen Style
2018/05/05 全球购物
I.T集团香港官方商城:ITeSHOP.com Hong Kong
2019/02/15 全球购物
Troy-Bilt官网:草坪割草机、吹雪机、分蘖机等
2019/02/19 全球购物
德国户外商店:eXXpozed
2020/07/25 全球购物
节约用电标语
2014/06/17 职场文书
反腐倡廉剖析材料
2014/09/30 职场文书
2014报到证办理个人委托书
2014/10/08 职场文书
大学生村官工作总结2015
2015/04/09 职场文书
毕业生就业推荐表自我鉴定
2019/06/20 职场文书
React 高阶组件HOC用法归纳
2021/06/13 Javascript