odoo10 ORM操做

很是有用的odoo ORM參考手冊:  odoo V10中文參考手冊(一:ORM API      (部份內容沒有更新到這裏)html


坑! 若是數據表已存在記錄, 當新增字段時, 填了required=True 只是對界面進行了限制...數據庫沒有requiredgit

一 模型使用

模型的屬性結構:數據庫

_name 業務對象的名稱
_rec_name 可選的name字段名稱,供osv的name_get()方法使用,默認值name
_inherit 若是設置了name屬性,它的取值是單個或多個父級的模型名稱;沒有設置name屬性時,只能是單個模型名稱
_order 在搜索的時候的默認排序,默認值是id
_auto 指定該表是否須要建立,默認值是True,若是設置成False須要重寫init方法來建立表
_table 當_auto設置成false時,該值爲建立的表名;默認狀況下會自動生成一個
_inherits 定義上級模型關聯使用的外鍵

1 ORM的CRUD

- create(vals)         增
- browse([ids])        查
- unlink()             刪
- write(vals)          改
    int或float型字段,給定的值須爲對應的整型或浮點型
    布爾型字段,對應的值須爲bool型
    Selection字段,給定的值須符合條件
    Many2one字段,給定的值須與對應的數據庫記錄相符
    其餘無關聯關係的字段使用字符串做值
    One2many和Many2many字段經過一個特殊的格式命令來操縱對應字段值,經過一系列三元組按順序來對數據進行操做,下面是一些經常使用的:
        (0, _, values) 爲指定的value字典添加一條新記錄
        (1, id, values) 更新一條現有記錄,條件是id爲指定id且value在指定values中,不能在create方法裏使用
        (2, id, _) 將指定id的數據從數據集中刪除並從數據庫刪除,不能在create裏使用
        (3, id, _) 將指定id的數據從數據集中刪除但不從數據庫刪除,不能用在One2many關係及create裏
        (4, id, _) 將指定id的數據添加到數據集中,不能用在One2many關係上
        (5, _, _) 將集合的全部數據刪除,至關於當3做用於每條記錄上
        (6, _, ids) 使用ids列表裏匹配的全部數據替換當前記錄,至關於先執行5再循環執行4
        
read([fields]) 從self裏讀取指定的字段,專供rpc使用
read_group(domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True) 獲得一個經過groupby參數分組後的記錄的列表

2 searching

- search(args[, offset=0][, limit=None][, order=None][, count=False])
    根據args參數裏的domain表達式來搜索全部記錄,參數列表:
        1.args domain表達式,爲空時返回全部記錄
        2.offset (int) 從第幾條記錄開始取
        3.limit (int) 返回記錄行數的最大值
        4.order (str) 排序的字段
        5.count (bool) 當值爲True的時候只返回匹配記錄的條數
    
- search_count(args)
    返回根據給定domain表達式參數查詢所獲得的記錄條數

- name_search(name='', args=None, operator='ilike', limit=100)
    返回根據name條件來查詢,並知足args指定的domain表達式的記錄集合
        name (str) -- 用來匹配的name字符串
        args (list) -- domain表達式列表
        operator (str) --  用來匹配的操做符,如: 'like''='.
        limit (int) -- 可選參數,最多返回的記錄行數

3 記錄集合操做

- ids                                      獲得當前記錄集合的id列表
- ensure_one()                             驗證一個記錄集合是否只包含一條記錄
- exists()                                 返回當前記錄集中真正存在的子集,並把緩存中未刪除的部分作標記,可用於判斷if record.exists():
- filtered(func)                           返回知足func參數內條件的記錄集合,參數能夠是一個函數或者用.分隔的字段列表
- sorted(key=None, reverse=False)          返回按key排序以後的記錄集,key參數能夠是一個返回單個key的函數或字段名稱或爲空,reverse參數爲True時即爲倒序
- mapped(func)                             將func函數應用到全部記錄上,並返回記錄列表或集合

4 環境切換

- sudo([user=SUPERUSER])                        返回經過指定用戶獲得的新記錄集,默認會返回SUPERUSER的記錄集(前提是權限沒有問題)
- with_context([context][, **overrides])        返回當前記錄集在擴展環境下的新記錄集,擴展環境能夠由指定環境和overrides參數合併而成、或由當前環境和overrides參數合併而成
- with_env(env)                                 返回在指定環境下的新版記錄集合

5 字段和視圖查詢

- fields_get([fields][, attributes])
    以數據字典的形式返回字段的定義,經過繼承得來的字段也會在其中,string/help/selection屬性會自動被翻譯
    fields參數是字段列表、爲空或不傳返回全部字段
    attributes 可指定字段的屬性、爲空或不傳時返回所有的
    
- fields_view_get([view_id | view_type='form'])
    返回指定視圖的具體組成如:字段,模型,視圖結構
    參數列表:
    view_id 視圖的id或None
    view_type 當view_id參數爲空時指定視圖類型如form,tree等
    toolbar 參數爲true時將上下文動做包含在內
    odoo 視圖

6 其餘方法

- default_get(fields)             獲取指定字段的默認值
- name_get()                      以列表形式返回每條記錄的描述,默認是display_name字段
- name_create(name)               至關於調用create方法建立一條新記錄而只設置一個display_name

7 內置字段

id 數據識別字段
_log_access 決定額外增長的字段的字段(created_date,write_uid..)是否建立,默認值True
create_date 記錄建立的時間
create_uid 建立人的id,關聯到res.users
write_date 記錄最近的修改時間
write_uid 最近修改記錄的用戶id,關聯到res.users

8 保留字段

一些字段名稱是給model保留的,用來實現一些預約義的功能。當須要實現對應功能是須要對相應的保留字段進行定義api

name(Char) -- _rec_name的默認值,在須要用來展現的時候使用
active(Boolean) -- 設置記錄的全局可見性,當值爲False時經過search和list是獲取不到的
sequence(Integer) -- 可修改的排序,能夠在列表視圖裏經過拖拽進行排序
state(Selection) -- 對象的生命週期階段,經過fileds的states屬性使用
parent_id(Many2one) -- 用來對樹形結構的記錄排序,並激活domain表達式的child_of運算符
parent_left,parent_right -- 與 _parent_store結合使用,提供更好的樹形結構數據讀取

二 裝飾器函數

odoo.api.multi(method)         在記錄行方式下裝飾一個對記錄進行操做的方法
odoo.api.model(method)         在記錄行方式下裝飾一個內容不明確、但模型明確的方法
odoo.api.depends(*args)        返回爲compute方法指定依賴字段的裝飾器,每一個參數必須是字符串
odoo.api.constrains(*args)     裝飾一個約束檢查方法,每一個參數必須是須要檢查的字段
odoo.api.onchange(*args)       返回一個監控指定字段的onchange方法的裝飾器,每一個參數必須是字段名稱
odoo.api.returns(model, downgrade=None, upgrade=None)        返回一個獲取model實例的方法的裝飾器
odoo.api.one(method)
odoo.api.v7(method_v7) 
odoo.api.v8(method_v8)

三 字段

1 基本字段

- class odoo.fields.Field(string=, **kwargs)    (普通字段)
    參數列表:
    string(string) -- 用戶能看到的字段的標籤
    help(string) -- 用戶能看到的關於該字段的提示
    readonly(boolean) -- 字段是否設置爲只讀,默認爲False
    required(boolean) -- 字段是否爲必須,默認False
    index(boolean) -- 字段是否做爲索引保存在數據庫中,默認False
    default -- 字段的默認值,能夠是一個特定的值或者一個有返回值的函數,可以使用default=None來忽略字段的default設置
    states -- 用數據字典封裝視圖裏的屬性-值對,如'readonly', 'required', 'invisible'
    groups -- 用逗號分隔的xml id列表,能夠限制用戶對字段的訪問
    copy(boolean) -- 指定當數據行被複制時該字段是否被複制,默認是True,實時計算字段和one2many字段默認爲False
    oldname(string) -- 以前的字段名稱,在作數據遷移的時候orm能夠自動進行重命名

- 實時計算字段
    可定義一個字段,它的值經過指定函數實時計算得來,定義實時計算字段只須要指定compute屬性便可,它有如下幾種參數:
    compute -- 用於計算的函數名稱
    inverse -- 逆向計算函數的函數名,可選
    search -- 實現該字段search方法的函數名
    store -- 是否在數據庫存儲該字段值,默認False
    compute_sudo -- 是否須要使用超級管理員對該字段進行從新計算

- 關聯字段
    關聯字段的值是經過一系列的外鍵字段並經過其關聯的模型讀取,參數:related
    屬性(string, help, readonly, required,groups, digits, size, translate, sanitize, selection, comodel_name, domain, context)
只要沒有被重定義會自動從源字段複製過來,默認狀況下關聯字段是不保存到數據庫的,就像實時計算字段同樣,能夠經過指定store
=True來指定保存 - 依賴於Company的字段 假如一個用戶屬於多個公司,那麼他在不一樣記錄條件下獲得的該字段值是不一樣的,參數 company_dependent -- boolean(默認False) - sparse 字段 sparse字段通常是不爲null的,大部分這類字段用於序列化存儲,參數sparse -- 該字段值的存儲位置 - 增長的定義 子類能夠重定義與父類同名同類型的字段,字段屬性也會從父類繼承過來而且能夠被重定義 例:第二個子類只爲state字段添加提示 class First(models.Model): _name = 'foo' state = fields.Selection([...], required=True) class Second(models.Model): _inherit = 'foo' state = fields.Selection(help="Blah blah blah")

2 經常使用字段

- class odoo.fields.Char(string=, **kwargs) 字符串字段,可指定長度,通常在客戶端以單行顯示
    參數
        size (int) -- 值的最大長度
        translate -- 啓用字段的翻譯
- class odoo.fields.Boolean(string=, **kwargs) 布爾類型
- class odoo.fields.Integer(string=, **kwargs) 整型
- class odoo.fields.Float(string=, digits=, **kwargs) 浮點型,可接受digits 參數(total, decimal)指定位數
- class odoo.fields.Text(string=, **kwargs) Text類型,用於儲存較多的內容
- class odoo.fields.Selection(selection=, string=, **kwargs)
    參數
        selection -- 指定該字段的取值列表,爲(value,string)列表或一個模型的方法或方法名
        selection_add -- 當該字段來自重定義時,它提供selection參數的擴展,爲(value,string)列表
- class odoo.fields.Html(string=, **kwargs) 儲存html內容
- class odoo.fields.Date(string=, **kwargs) date類型
    1.static context_today(record, timestamp=None)
        返回客戶端時區的當前日期,能夠接收一個datetime格式的參數
    2.static from_string(value) 將ORM的值轉換爲date的值
    3.static to_string(value) 將date格式的值轉換爲ORM的值
    4.static today(*args) 以ORM值的格式返回當前日期
- class odoo.fields.Datetime(string=, **kwargs)

3 關係模型字段

- class odoo.fields.Many2one(comodel_name=, string=, **kwargs)    該字段的獲取到的集合的記錄數量只會是0(無記錄)或1(單條記錄)
    參數列表:
    comodel_name(string) -- 目標模型名稱,除非是關聯字段不然該參數必選
    domain -- 可選,用於在客戶端篩選數據的domain表達式
    context -- 可選,用於在客戶端處理時使用
    ondelete -- 當所引用的數據被刪除時採起的操做,取值:'set null', 'restrict', 'cascade'
    auto_join -- 在搜索該字段時是否自動生成JOIN條件,默認False
    delegate -- 設置爲True時能夠經過當前model訪問目標model的字段,與_inherits功能相同
    
- class odoo.fields.One2many(comodel_name=, inverse_name=, string=, **kwargs)    該字段的值是目標model的全部記錄
    參數列表:
    comodel_name -- 目標模型名稱,
    inverse_name -- 在comodel_name 中對應的Many2one字段
    domain -- 可選,用於在客戶端篩選數據的domain表達式
    context -- 可選,用於在客戶端處理時使用
    auto_join -- 在搜索該字段時是否自動生成JOIN條件,默認False
    limit(integer) -- 可選,在讀取時限制數量
    
    注:除非是關聯字段,不然comodel_name和inverse_name是必選參數
        虛擬的關係
        必須依賴Many2one
        One2many是一個虛擬關聯,因此必須有一個Many2one字段存在於other_model,其名稱也必須是related_field

- class odoo.fields.Many2many(comodel_name=, relation=, column1=, column2=, string=, **kwargs)        該字段的值爲一個數據集合
    參數:
    comodel_name -- 目標模型名稱,除非是關聯字段不然該參數必選
    relation -- 可選,關聯的model在數據庫存儲的表名,默認採用comodel_name獲取數據
    column1 -- 可選,與relation表記錄相關聯的列名
    column2 -- 可選,與relation表記錄相關聯的列名
    domain -- 可選,用於在客戶端篩選數據的domain表達式
    context -- 可選,用於在客戶端處理時使用
    limit(integer) -- 可選,在讀取時限制數量
    
- class odoo.fields.Reference(selection=, string=, **kwargs)    基於odoo.fields.Selection

四 繼承和擴展

odoo有三種模塊化的模型繼承機制:緩存

  1 根據原有模型建立一個全新的模型,並基於新建立的模型修改,新模型與已存在的視圖兼容,並保存在同一張表中
  2 從其餘模塊中擴展模型,並進行替換,通常用於複製,已存在的視圖會忽略新建的模型,數據保存在新的數據表中
  3 經過代理訪問其餘模型的字段,能夠同時繼承多個模型,數據保存在新的數據表中,新的模型會包含一個嵌入的原模型,而且該模型數據是同步的app

1 傳統繼承

當_inherit和_name屬性一塊兒使用時,odoo基於原有模型建立一個新模型,新的模型會自動繼承原模型的字段、方法等dom

class Inheritance0(models.Model):
    _name = new
    _inherit = obj1

    pass

2 擴展

當只使用_inherit屬性時,新的模型會替代已存在的模型,當須要給模型添加字段、方法、重置屬性時比較有用ide

class Inheritance1(models.Model):
    _name = obj1    # 能夠忽略不寫
    _inherit = obj1

    pass

3 代理

代理模式使用_inherits屬性來指定一個模型當找不到指定字段時直接去對應的子模型查找

繼承並新建
將新model的每一個記錄連接到父model中, 而且能夠訪問(讀取/修改)父記錄字段模塊化

相關文章
相關標籤/搜索