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