odoo10 ORM操作
非常有用的odoo ORM參考手冊: ?odoo V10中文參考手冊(一:ORM API? ?? (部分內容沒有更新到這里)
坑! 如果數據表已存在記錄, 當新增字段時, 填了required=True 只是對界面進行了限制...數據庫沒有required
一 模型使用
模型的屬性結構:
_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再循環執行4read([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或Noneview_type 當view_id參數為空時指定視圖類型如form,tree等toolbar 參數為true時將上下文動作包含在內odoo 視圖6 其他方法
- default_get(fields) 獲取指定字段的默認值 - name_get() 以列表形式返回每條記錄的描述,默認是display_name字段 - name_create(name) 相當于調用create方法創建一條新記錄而只設置一個display_name7 內置字段
id 數據識別字段 _log_access 決定額外增加的字段的字段(created_date,write_uid..)是否創建,默認值True create_date 記錄創建的時間 create_uid 創建人的id,關聯到res.users write_date 記錄最近的修改時間 write_uid 最近修改記錄的用戶id,關聯到res.users8 保留字段
一些字段名稱是給model保留的,用來實現一些預定義的功能。當需要實現對應功能是需要對相應的保留字段進行定義
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) -- 字段是否設置為只讀,默認為Falserequired(boolean) -- 字段是否為必須,默認Falseindex(boolean) -- 字段是否作為索引保存在數據庫中,默認Falsedefault -- 字段的默認值,可以是一個特定的值或者一個有返回值的函數,可使用default=None來忽略字段的default設置states -- 用數據字典封裝視圖里的屬性-值對,如'readonly', 'required', 'invisible'groups -- 用逗號分隔的xml id列表,可以限制用戶對字段的訪問copy(boolean) -- 指定當數據行被復制時該字段是否被復制,默認是True,實時計算字段和one2many字段默認為Falseoldname(string) -- 之前的字段名稱,在做數據遷移的時候orm可以自動進行重命名- 實時計算字段可定義一個字段,它的值通過指定函數實時計算得來,定義實時計算字段只需要指定compute屬性即可,它有以下幾種參數:compute -- 用于計算的函數名稱inverse -- 逆向計算函數的函數名,可選search -- 實現該字段search方法的函數名store -- 是否在數據庫存儲該字段值,默認Falsecompute_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條件,默認Falsedelegate -- 設置為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條件,默認Falselimit(integer) -- 可選,在讀取時限制數量注:除非是關聯字段,否則comodel_name和inverse_name是必選參數虛擬的關系必須依賴Many2oneOne2many是一個虛擬關聯,所以必須有一個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 通過代理訪問其他模型的字段,可以同時繼承多個模型,數據保存在新的數據表中,新的模型會包含一個嵌入的原模型,并且該模型數據是同步的
1 傳統繼承
當_inherit和_name屬性一起使用時,odoo基于原有模型創建一個新模型,新的模型會自動繼承原模型的字段、方法等
class Inheritance0(models.Model):_name = new_inherit = obj1pass2 擴展
當只使用_inherit屬性時,新的模型會替代已存在的模型,當需要給模型添加字段、方法、重置屬性時比較有用
class Inheritance1(models.Model):_name = obj1 # 可以忽略不寫_inherit = obj1pass3 代理
代理模式使用_inherits屬性來指定一個模型當找不到指定字段時直接去對應的子模型查找
繼承并新建
將新model的每個記錄鏈接到父model中, 并且可以訪問(讀取/修改)父記錄字段
轉載于:https://www.cnblogs.com/sunch/p/10553764.html
總結
以上是生活随笔為你收集整理的odoo10 ORM操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [转]jkeyll的安装步骤
- 下一篇: Luogu3732 [HAOI2017]