Django 对象关系映射(ORM)源码详解

yipeiwu_com7年前Python基础

前言

从前面已经知道, 一个 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使用正则表达式的集合字符的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 在正则表达式里,想匹配一些字符中的一个,也...

Zabbix实现微信报警功能

Zabbix实现微信报警功能

一、 申请企业微信账号,申请地址 https://qy.weixin.qq.com/ 二、 登陆企业微信账 图一 图二 2、添加微信账号  图一 图二 完成以上步骤...

在python里协程使用同步锁Lock的实例

尽管asyncio库是使用单线程来实现协程的,但是它还是并发的,乱序执行的。可以说是单线程的调度系统,并且由于执行时有延时或者I/O中断等因素,每个协程如果同步时,还是得使用一些同步对象...

django 实现电子支付功能的示例代码

django 实现电子支付功能的示例代码

思路:调用第三方支付 API 接口实现支付功能。本来想用支付宝来实现第三方网站的支付功能的,但是在实际操作中发现支付宝没有 Python 接口,网上虽然有他人二次封装的的 Python...

R vs. Python 数据分析中谁与争锋?

R vs. Python 数据分析中谁与争锋?

当我们想要选择一种编程语言进行数据分析时,相信大多数人都会想到R和Python——但是从这两个非常强大、灵活的数据分析语言中二选一是非常困难的。 我承认我还没能从这两个数据科学家喜爱的语...