odoo 计算字段


主要介绍 depend、onchange 和 self。

计算字段

字段是直接存储在数据库中,并直接从数据库中检索。在odoo中,字段也可以是计算值。在这种情况下,字段的值不是从数据库中检索出来的,而是通过调用模型的方法实时计算出来的。

若要创建计算字段,需要设置字段属性。compute方法的名称。计算方法应该简单地设置要计算在self

import random
from odoo import models, fields, api

class ComputedModel(models.Model):
    _name = 'test.computed'

    name = fields.Char(compute='_compute_name')  # 添加一个compute属性,后面是一个方法。

    def _compute_name(self):
        for record in self: # 这里的 self 是一个集合
            record.name = str(random.randint(1, 1e6))

self是一个集合

对象self记录集,即有序收集记录。它支持集合上的标准Python操作,如len(self)iter(self),加上额外的设置操作,如recs1 + recs2.

迭代self一个接一个地给出记录,其中每个记录本身都是一个大小为1的集合。record.name.

对象self.env允许访问请求参数和其他有用的东西:

  • self.env.crself._cr是数据库光标对象;它用于查询数据库。
  • self.env.uidself._uid是当前用户的数据库id
  • self.env.user是当前用户的记录
  • self.env.contextself._context是上下文字典
  • self.env.ref(xml_id)返回与xml id对应的记录。
  • self.env[model_name]返回给定模型的实例。

depends 依赖

计算字段的值通常取决于计算记录上其他字段的值。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') # 当value这个字段的值发生改变的时执行方法
    def _compute_name(self):
        for record in self:
            record.name = "Record with value %s" % record.value

字段默认值

在字段定义中,添加选项default=X哪里X是Python文字值(布尔值、整数值、浮点值、字符串),或者是接受记录集并返回值的函数

name = fields.Char(default="Unknown")
user_id = fields.Many2one('res.users', default=lambda self: self.env.user)
start_datetime = fields.Datetime('Start DateTime', default=fields.Datetime.now()) # 默认为当前时间

Onchange 实时更新机制

“onchange”机制为客户端接口提供了一种方法,以便在用户填写字段中的值时更新表单,而无需将任何内容保存到数据库中。和depends类似。

例如,假设模型有三个字段amount, unit_priceprice,您希望在修改任何其他字段时更新表单上的价格。要实现这一点,请定义以下方法self表示窗体视图中的记录,并用onchange()若要指定必须在哪个字段上触发该字段,请执行以下操作。你做的任何改变self将反映在表格上。

<!-- content of form view -->
<field name="amount"/>
<field name="unit_price"/>
<field name="price" readonly="1"/>
# onchange handler
@api.onchange('amount', 'unit_price')  # 修改这两个值的时候执行。
def _onchange_price(self):
    # set auto-changing field
    self.price = self.amount * self.unit_price
    # Can optionally return a warning and domains
    return {
        'warning': {
            'title': "Something bad happened",
            'message': "It was very bad indeed",
        }
    }

虽然 api.dependsapi.onchange有诸多相似的地方,但一个重要区别就是 onchange 的侦测字段范围需要在同一个模型或界面上;而depends 可以侦测关联的模型的字段(可以跨不同表)。


文章作者: theing
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 theing !
评论
  目录