iT邦幫忙

2023 iThome 鐵人賽

DAY 18
1
Odoo

Odoo開發系列 第 18

[Day 18] odoo14 - @api.onchange及@api.depends介紹

  • 分享至 

  • xImage
  •  

今天換來介紹在原生中很常使用的兩個方法,分別是@api.onchange以及@api.depends,下面就來詳細的介紹兩者的用法。

@api.onchange

qty = fields.Integer(string='數量', default=1, required=True)
price_unit = fields.Integer(string='單價', required=True, default=0)
amount = fields.Integer(string='合計', required=True)

@api.onchange('qty', 'price_unit')
def compute_amount(self):
    for i in self:
        if i.qty and i.price_unit:
            i.amount = i.qty * i.price_unit

@api.onchange用於在畫面上某個欄位的值有任何異動時便會觸發,即時更新另外一個欄位的值,但限於兩個欄位要為同一model或同一畫面上才可被觸發。
若要使用此種方法時在定義的function上面加上@api.onchange(確認有無變動的欄位)即可,確認有無變動的欄位可以傳入多個。
@api.onchange有一點需要注意,那就是他計算出來的值,並不會實際儲存於資料庫,僅將計算的結果顯示於畫面上。
以上面範例來說,數量或是單價有異動時,合計都會隨著異動而改變。

@api.depends

rate = fields.Float(string="費率", default=100.0)
amount = fields.Integer(string="金額")
quantity = fields.Integer(string="數量", default=1)
total = fields.Float(compute="_compute_total", string="總金額", store=True)

@api.depends("quantity", "amount", "rate")
def _compute_total(self):
    for line in self:
        line.total = float(line.quantity) * line.amount * line.rate / 100

@api.depends則是於按下儲存時才會觸發,用於某個欄位的值依賴於其他欄位的值,當依賴欄位的值被更改時,受影響的欄位會重新計算值,不論兩者欄位的model為何,依賴欄位被修改時,受影響的欄位一定會被異動。
若要使用此種方法時在定義的function上面加上@api.depends(依賴欄位)以及受影響欄位要加上compute='function名稱'即可,依賴欄位可以傳入多個。
若被影響欄位的值需要儲存時,可在欄位後面加上store=True,即可將值儲存於資料庫。
以上面的範例來說,當費率、金額、數量被異動且儲存時,總金額都會被重新計算。

兩者還有許多彈性的使用情境,並不限於金額的計算,這邊只是先舉簡單的例子來幫助了解,還有許多應用情境讓大家去發掘。


上一篇
[Day 17]odoo14 - Inherit介紹(二)
下一篇
[Day 19] odoo14 - 發送mail設定
系列文
Odoo開發30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言