1. 程式人生 > >odoo11 ORM API指南

odoo11 ORM API指南

earch hub 可能性 onchange 們的 帶來 找不到 not hang

參考: 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 要動態計算[字段默認值], 我們可以給字段綁定一個【函數】, 而不是一個固定值

3 在更改字段時在其他字段上設置值, 我們可以使用【onchange】函數 (例子:當選擇一個客戶時,將其貨幣設為文檔的貨幣, 以後可以由用戶手動更改)。註意: 僅適用於form表單交互, 不適用於【直接】寫入調用, 但是表單save時, 將會寫入

總結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指南