主要介绍 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.cr或self._cr是数据库光标对象;它用于查询数据库。self.env.uid或self._uid是当前用户的数据库idself.env.user是当前用户的记录self.env.context或self._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_price和price,您希望在修改任何其他字段时更新表单上的价格。要实现这一点,请定义以下方法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.depends 与api.onchange有诸多相似的地方,但一个重要区别就是 onchange 的侦测字段范围需要在同一个模型或界面上;而depends 可以侦测关联的模型的字段(可以跨不同表)。