计算字段
如下
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
xml
课时列表视图和表单视图添加
<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字段 self.env[model_name] 返回某个model class对象
原文地址:https://www.cnblogs.com/itelephant/p/11819210.html
时间: 2024-10-21 14:56:43