计算字段和缺省值
目前为止,我们将字段信息直接存储在数据库中,或者直接从数据库中检索信息。字段信息也可以是计算的内容。这种情况下,字段的值不是直接从数据库中检索,而是在业务实体的方法被调用时计算出来的。
创建计算字段的方法是,建立一个字段,设置它的属性compute
为一个方法名称。这个计算方法通过self
获取数据记录集合,并通过计算获得该字段的值。
警告:
self
是一个集合,self
对象是一个数据记录集(recordset)。它支持 Python 标准的操作集合的方法,例如:len(self)
、iter(self)
以及recs1 + recs2
等。通过迭代获取self
每一条记录,就可以对每条记录的字段进行读取和赋值操作,例如:record.name
。
import random
from odoo import models, fields, api
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))
依赖
计算字段的值通常依赖数据记录的其他字段的值。ORM要求开发者通过depends()
装饰器指明该计算字段的依赖项,该注解用于通知 ORM 组件在依赖项的值发生变化时,重新计算该字段的值。
from odoo import models, fields, api
class ComputedModel(models.Model):
_name = 'test.computed'
name = fields.Char(compute='_compute_name')
value = fields.Integer()
@api.depends('value')
def _compute_name(self):
for record in self:
record.name = "Record with value %s" % record.value
计算字段练习:5-1
- 为实体 Session 添加座位被占用的百分比
- 在 tree 和 form 视图中显示该字段
将该字段显示为一个进度条
为实体 Session 添加计算字段
在 Session 视图中显示该字段
缺省值
任何字段都可以设定缺省值。在字段的定义语句中,添加选项default=X
,X
是 Python 的常规数据类型值(boolean, integer, float, string),或者一个函数(该函数接收一个数据记录集合,返回一个值)。
name = fields.Char(default="Unknown")
user_id = fields.Many2one('res.users', default=lambda self: self.env.user)
备注:
self.env
对象提供请求参数处理和其他一些信息:
self.env.cr
或者self._cr
是数据库游标对象,用于数据库的查询;self.env.uid
或者self._uid
是当前用户的数据库标识;self.env.user
是当前用户的数据记录;self.env.context
或者self._context
是当前上下文数据字典;self.env.ref(xml_id)
返回指定xml标识对应的数据记录;self.env[model_name]
返回给定实体的实例。
缺省值练习:5-2
- 为 Session 实体的
start_date
字段设定缺省值为“今天”(参见:Date
)。- 为 Session 实体添加
active
字段,并设置缺省值为“True“。