如下
import random from odoo import models, fields class ComputedModel(models.Model): _name = 'test.computed' name = fields.Char(compute='_compute_name') @api.multi def _compute_name(self): for record in self: record.name = str(random.randint(1, 1e6))
當每次調用rec.name
時,都會調用compute方法來計算字段的值
self是一個record集合(recordset),可以for循環出里面的單個記錄,單個記錄可以用 . 來訪問字段
recordset還支持+號操作
依賴計算
1 from odoo import models, fields, api 2 3 class ComputedModel(models.Model): 4 _name = 'test.computed' 5 name = fields.Char(compute='_compute_name') 6 value = fields.Integer() 7 8 @api.depends('value') 9 def _compute_name(self): 10 for record in self: 11 record.name = "Record with value %s" % self.value
通過@api.depends('value') 當 value值改變時會自動重新計算name, 並顯示在界面上
練習
添加課程小節的上課人數百分比,並用一個進度條顯示
models
1 taken_seats = fields.Float(string="Taken seats", compute='_taken_seats') 2 3 @api.depends('seats', 'attendee_ids') 4 def _taken_seats(self): 5 for r in self: 6 if not r.seats: 7 r.taken_seats = 0.0 8 else: 9 r.taken_seats = 100.0 * len(r.attendee_ids) / r.seats
課時列表視圖和表單視圖添加
<field name="taken_seats" widget="progressbar"/>
默認值
通過default=來設置字段的默認值
name = fields.Char(default="Unknown") user_id = fields.Many2one('res.users', default=lambda self: self.env.user)
self.env使用方法
self.env.cr or self.cr 數據庫指針 self.env.uid or self.uid 當前請求用戶id self.env.user 當前請求用戶記錄 可以訪問self.env.user.name 等 self.env.context or self._context 當前上下文 self.env.ref(xml_id) 通過xml_id訪問某個記錄 xml_id對應ir_model_data的name字段