计算字段和缺省值

目前为止,我们将字段信息直接存储在数据库中,或者直接从数据库中检索信息。字段信息也可以是计算的内容。这种情况下,字段的值不是直接从数据库中检索,而是在业务实体的方法被调用时计算出来的。

创建计算字段的方法是,建立一个字段,设置它的属性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 视图中显示该字段

openacademy/models/models.py

openacademy/views/openacademy.xml

缺省值

任何字段都可以设定缺省值。在字段的定义语句中,添加选项default=XX是 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“。

openacademy/models/models.py

openacademy/views/openacademy.xml

results matching ""

    No results matching ""