Django 原始碼小剖: Django 物件關係對映(ORM)

weixin_33831673發表於2013-10-12

從前面已經知道, 一個 request 的到來和一個對應 response 的返回的流程, 資料處理和資料庫離不開. 我們也經常在 views.py 的函式定義中與資料庫打交道.

django ORM 原始碼組織結構

對於資料庫, django 有自己的一套 ORM(物件關係對映), 或許其他的框架可以隨意更換 ORM, 但 django 不建議這麼做. 因為 django 內建有很多的 model, 這些 model 無疑是用 django 內建 ORM 實現的, 如果更換後, 內建的 model 就無效了, 除非以下兩個選擇:

  1. 你已經吃透了 django 的 ORM, 定製自己的 ORM, 但必須用裡面的規則, 比如類的屬性名等等;
  2. 又或者更換自己的 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 吧.

搗亂 2013-9-22

http://daoluan.net

相關文章