Django 對(duì)象關(guān)系映射(ORM)源碼詳解
前言
從前面已經(jīng)知道, 一個(gè) request 的到來(lái)和一個(gè)對(duì)應(yīng) response 的返回的流程, 數(shù)據(jù)處理和數(shù)據(jù)庫(kù)離不開(kāi). 我們也經(jīng)常在 views.py 的函數(shù)定義中與數(shù)據(jù)庫(kù)打交道.
django ORM 源代碼組織結(jié)構(gòu)
對(duì)于數(shù)據(jù)庫(kù), django 有自己的一套 ORM(對(duì)象關(guān)系映射), 或許其他的框架可以隨意更換 ORM, 但 django 不建議這么做. 因?yàn)?django 內(nèi)置有很多的 model, 這些 model 無(wú)疑是用 django 內(nèi)置 ORM 實(shí)現(xiàn)的, 如果更換后, 內(nèi)置的 model 就無(wú)效了, 除非以下兩個(gè)選擇:
你已經(jīng)吃透了 django 的 ORM, 定制自己的 ORM, 但必須用里面的規(guī)則, 比如類(lèi)的屬性名等等;
又或者更換自己的 ORM, 不使用 django 內(nèi)置的 model.
django 是一個(gè)大而全的框架, 但大而全卻又增加了它本身的負(fù)擔(dān), 使其靈活性大大降低. 所以你看, 高內(nèi)聚低耦合不容易做到.
數(shù)據(jù)庫(kù)本身的復(fù)雜的, 數(shù)據(jù)庫(kù)操作涉及的選項(xiàng)有很多, 一個(gè) ORM 也并不簡(jiǎn)單. django 數(shù)據(jù)庫(kù)部分在 django.db 中實(shí)現(xiàn), 在展開(kāi)之前先介紹一下它的源代碼文件組織:
django.db
----backends 各種數(shù)據(jù)庫(kù)后端實(shí)現(xiàn)
----dummy 啞后端, 什么都不做, 定義空方法
----mysql mysql 實(shí)現(xiàn)
----oracle oracle 實(shí)現(xiàn)
----.....
----models 重頭戲, backends 中各種數(shù)據(jù)庫(kù)都是基于此實(shí)現(xiàn)的
----fields 數(shù)據(jù)庫(kù)表字段實(shí)現(xiàn)
----.....
----sql 語(yǔ)句, 記錄 sql 語(yǔ)句的各種選項(xiàng), where 等, 最后生成 sql 語(yǔ)句; 連接數(shù)據(jù)庫(kù)得到結(jié)果
----.....
----aggregates.py 聚合相關(guān)
----base.py 定義 Model 類(lèi)
----constants.py 一些常量
----deletion.py 數(shù)據(jù)庫(kù)表項(xiàng)的刪除實(shí)現(xiàn)
----expressions.py 表達(dá)式類(lèi), where 會(huì)出現(xiàn)表達(dá)式
----loading.py
----manager.py ORM 的管理器
----options.py 數(shù)據(jù)庫(kù)表選項(xiàng), 譬如主鍵等
----query.py 數(shù)據(jù)庫(kù)查詢(xún)集類(lèi)
----query_utils.py 小工具
----related.py 與`表關(guān)聯(lián)`相關(guān)
----signals.py
----__init__.py
django ORM 底層的實(shí)現(xiàn)都在 django.db.models 中. 如你所知, 數(shù)據(jù)庫(kù)操作的選項(xiàng)很多, 這里并不專(zhuān)注展開(kāi)這些選項(xiàng)在 django ORM 中是如何實(shí)現(xiàn)的, 而將展開(kāi)的是 django ORM 的實(shí)現(xiàn)的框架, 當(dāng)用 django ORM 執(zhí)行一個(gè)簡(jiǎn)單的查詢(xún)操作時(shí), 里面是如何工作的, 工具類(lèi)之間是如何協(xié)調(diào)的. 了解這些, 使用 django ORM 會(huì)更游刃有余.
我已經(jīng)在 github 備份了 Django 源碼的注釋: Decode-Django, 有興趣的童鞋 fork 吧.
相關(guān)文章
Python數(shù)據(jù)可視化之Pyecharts使用詳解
Pyecharts是一個(gè)由百度開(kāi)源的、用于生成Echarts圖表的類(lèi)庫(kù),可以用來(lái)進(jìn)行數(shù)據(jù)可視化分析。本文將詳細(xì)講解一下Pyecharts的使用,需要的可以參考一下2022-04-04
為什么選擇python編程語(yǔ)言入門(mén)黑客攻防 給你幾個(gè)理由!
為什么選擇python編程語(yǔ)言入門(mén)黑客攻防,小編今天給你幾個(gè)理由!Python語(yǔ)言的優(yōu)點(diǎn)、Python黑客攻擊優(yōu)點(diǎn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02
pandas應(yīng)用實(shí)例之pivot函數(shù)詳解
最近在做基于python的數(shù)據(jù)分析工作,引用第三方數(shù)據(jù)分析庫(kù)pandas,所以下面這篇文章主要給大家介紹了關(guān)于pandas應(yīng)用實(shí)例之pivot函數(shù)的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07
python數(shù)字圖像處理實(shí)現(xiàn)直方圖與均衡化
在圖像處理中,直方圖是非常重要,也是非常有用的一個(gè)處理要素。這篇文章主要介紹了python數(shù)字圖像處理實(shí)現(xiàn)直方圖與均衡化,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
python采用requests庫(kù)模擬登錄和抓取數(shù)據(jù)的簡(jiǎn)單示例
這篇文章主要介紹了python采用requests庫(kù)模擬登錄和抓取數(shù)據(jù)的簡(jiǎn)單示例,代碼簡(jiǎn)單卻功能強(qiáng)大!需要的朋友可以參考下2014-07-07
全面剖析Python的Django框架中的項(xiàng)目部署技巧
這篇文章主要全面剖析了Python的Django框架的部署技巧,包括Fabric等自動(dòng)化部署和建立單元測(cè)試等方面,強(qiáng)烈推薦!需要的朋友可以參考下2015-04-04
Python中Numpy包的安裝與使用方法簡(jiǎn)明教程
這篇文章主要介紹了Python中Numpy包的安裝與使用方法,結(jié)合簡(jiǎn)單實(shí)例形式分析了Python使用pip命令在線與離線whl包安裝,以及使用numpy打印隨機(jī)數(shù)矩陣的操作技巧,需要的朋友可以參考下2018-07-07
pandas object格式轉(zhuǎn)float64格式的方法
下面小編就為大家分享一篇pandas object格式轉(zhuǎn)float64格式的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04

