<rt id="umcai"><optgroup id="umcai"></optgroup></rt>
<tr id="umcai"><small id="umcai"></small></tr><rt id="umcai"><small id="umcai"></small></rt>
<acronym id="umcai"><small id="umcai"></small></acronym>

Odoo ORM

? ?

Model

模型定義,也就 基于 odoo.models.Model 或者 odoo.models.AbstractModel

以及 odoo.models.TransientModel 繼承出來的 模型, 它是 實實在在的 python Class

? ?

它會被ORM 轉化為 ModelClass,一個模型只有一個對應的 ModelCLass, 存在多個模型定義時,最終都合并到同一個 ModelClass

? ?

Odoo 模塊作為python package 被引入的時候,會運行 MetaModel 的魔術邏輯,往 models.MetaModel.module_to_models 登記

? ?

? ?

ModelClass

build_model() 時,首先將 Model 實例化為 ModelClass , 然后 再被實例化為 model,并執行 model __init__() 方法,完成 model 的初始化

? ?

ModelClass 的名稱格式為 例如 <class 'odoo.api.ir.model.constraint'>

? ?

? ?

RecordSet

通過 _browse() 方法,將 ModelClass env, 以及 ids 傳遞進去,從而獲取 recordset

? ?

先實例化 model recordset , 再將 env 綁定給 recordset

? ?

recordset 的名稱格式為 例如 ir.model.constraint()

如果 ids 是空值,則得到空記錄集, 空記錄集稱之為model

? ?

它們之間的關系,如圖所示

? ?

class1, class2, class3 是用戶自定義的 Model, 均繼承自 odoo.models.Model

? ?

? ?

Registry

每一個數據庫都會有一個 registry, 在加載數據庫的時候,新建registry。

然后掃描模塊列表,按照依賴關系,逐個加載Odoo 模塊,逐個將 Odoo 模塊加載到 registry, registry 使用它的 load() 方法 從models.MetaModel.module_to_models 讀取出 Model,并 調用 build_model() 將其實例化為 ModelClass

? ?

modelClass 建立完畢之后,也就是 registry 完成 load_moudles() 之后, 進行下一階段的邏輯 setup_models(), 新建 env,并且枚舉 env 里面加載的 ModelClass, ModelClass 實例化為 recordset, 此時的 recoredset 是空的,稱之為 model

? ?

setup_models() 過程中,會對 model 進行一系列的操作,比如 _prepare_setup(), _setup_base(),_setup_fields(),_setup_complete()

? ?

? ?

Env

odoo.api.Environment(cr, uid, context={})

新建env,先檢查registry是否存在,如果不存在,則建立registry

枚舉 env 時,會registry 獲取 modelClass 并返回它們的實例,也就是我們常用的

env['res.partner'] 是從注冊表 基于 ModelClass 名稱獲取它的 recordset.

? ?

? ?

? ?

Cursor

env.cr 里面 保存了游標, 可以用 游標執行 SQL

ORM 會將業務操作轉換為 SQL 并使用 execute() 在 數據庫執行

可以使用 commit() 顯式的提交事務, 也可以 使用 cr 的上下文管理器 自動進行自動提交

? ?

典型的自動提交的對象

WebRequest

registry.signal_changes()

? ?

使用上下文管理器調用 LazyCursor ,也會自動提交

? ?

? ?

備注:

env[] registry.models 的快捷方式

? ?

registry._db 是連接到當前數據庫的 連接 odoo.sql_db.Connection

model.pool 等同于 registry

? ?

Odoo backend 可以使用 self.env 獲取 env, 或者 self.registry self.pool 獲取 registry

? ?

Odoo frontend 則可以使用 request.env 獲取 env, request.registry 獲取 registry

? ?

<rt id="umcai"><optgroup id="umcai"></optgroup></rt>
<tr id="umcai"><small id="umcai"></small></tr><rt id="umcai"><small id="umcai"></small></rt>
<acronym id="umcai"><small id="umcai"></small></acronym>