您好,登錄后才能下訂單哦!
前言
從前面已經(jīng)知道, 一個(gè) request 的到來和一個(gè)對(duì)應(yīng) response 的返回的流程, 數(shù)據(jù)處理和數(shù)據(jù)庫離不開. 我們也經(jīng)常在 views.py 的函數(shù)定義中與數(shù)據(jù)庫打交道.
django ORM 源代碼組織結(jié)構(gòu)
對(duì)于數(shù)據(jù)庫, django 有自己的一套 ORM(對(duì)象關(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 吧.
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。