odoo11 ORM API指南
阿新 • • 發佈:2019-04-24
earch hub 可能性 onchange 們的 帶來 找不到 not hang 3 在更改字段時在其他字段上設置值, 我們可以使用【onchange】函數 (例子:當選擇一個客戶時,將其貨幣設為文檔的貨幣, 以後可以由用戶手動更改)。註意: 僅適用於form表單交互, 不適用於【直接】寫入調用, 但是表單save時, 將會寫入
參考: https://hub.packtpub.com/handle-odoo-application-data-with-orm-api-tutorial/
一、特殊裝飾器
@api.multi 默認有這個裝飾器, 需要一個自定義方法來對記錄集作操作
@api.one 單一記錄操作
@api.model 該方法在類級別操作,此時self是模型的參考
二、特殊方法
查
search()
browse()
增改刪
create(values) 在模型新增記錄時觸發 write(values) 修改時觸發 unlink() 刪除時觸發
在某些情況下, 我們需要擴展這些方法以添加一些業務邏輯, 以便在執行這些操作時觸發
Python3通過super()函數執行上一個mro方法, 如: super(TodoTask, self).create(vals),;如果我不介意破壞Python支持, 可以不傳引用類名和self參數,如super().create(vals)
自定義create()
@api.model def create(self, vals): # 執行前業務邏輯 ret = super(TodoTask, self).create(vals) # 自定義執行後業務邏輯return ret
自定義write()
@api.multi def write(self, vals): # 業務邏輯 ret = super(TodoTask, self).write(vals) # 業務邏輯 return ret
總結1
擴展create、write給我們帶來了更多的可能性, 但很多情況下我們不需要那樣, 因為我們還有一些工具更適合,比如:
1 基於其他字段自動計算字段值, 應該使用【計算字段】(例子: 當一個行數改變時,計算總數)
2 要動態計算[字段默認值], 我們可以給字段綁定一個【函數】, 而不是一個固定值
總結2
使用自定create,write之前認真考慮
1 用得更多的情況是:
- 保存記錄時執行一些驗證
- 保存記錄時自動計算某些字段
2 出於某種原因, 計算字段和contraints不是有效的解決方案時, 最好的方法時將我們的邏輯寫在自定義create/write方法上, 並將所需的更改累積到將傳遞給super()調用的vals字典中
註意
對於write()方法, 在同一模型上進一步的寫操作將導致遞歸循環, 並在工作進程資源耗盡時報錯
解決辦法:在context設置一個表示是
例如:
if not self.env.context.get(‘todo_task_writing‘): # 找不到特殊標記才運行 self.with_context(todo_task_writing=True).write(somevalues) # 第一次來時設置上特殊標記, 第二次不進這個if了
odoo11 ORM API指南