计算
到目前为止,字段已直接存储在数据库或直接从数据库中检索。字段也可以被计算。如果字段用compute的计算方法,不会从数据库中检索字段的值,而是通过调用模型的方法计算出值。
为了计算字段,请创建一个字段并为其添加compute属性(去承载计算结果),比如:
import random
from Xodoo 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是一个记录集合。
它支持Python中对于集合的操作,例如:len(self) 和 iter(self) 以及recs1 + recs2。
遍历self会得到一条一条的记录,每个记录本身就是一个大小为1的集合。你可以使用.来访问/分配单个记录上的字段,如record.name。
依赖
计算字段的值通常依赖其他字段的值。ORM期望开发人员使用装饰器指定对计算方法的依赖depends()。当依赖项被修改时,ORM会使用新给给定的依赖项重新计算:
from Xodoo import models, fields, api
class ComputedModel(models.Model):
_name = 'test.computed'
name = fields.Char(compute='_compute_name')#添加compute属性
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)
self.env可以访问请求参数和其他东西:(非常常用!)
- self.env.cr或者self._cr 是数据库cursor对象;或者它被用于查询数据库
- self.env.uid或者self._uid是当前用户的数据库ID
- self.env.user是当前用户的记录
- self.env.context或者self._context是上下文字典
- self.env.ref(xml_id)返回与XML id对应的记录
onchange
“onchange”机制为客户端界面提供了一种方法,只要用户在字段中填写了值,便无需用户将任何内容保存到数据库就可以更新表单。
例如:假设一个模型有三个字段amount,unit_price和 price,并且你想在修改任何其他字段时更新表单上的价格。为此,请定义一个方法,该方法在self表单视图中表示记录,并用其修饰onchange()以指定必须在哪个字段上触发记录。你所做的任何更改self都会反映在表格上。
<!-- content of form view --> <field name="amount"/> <field name="unit_price"/> <field name="price" readonly="1"/>
@api.onchange('amount', 'unit_price')#我们称为修饰器 def _onchange_price(self): # 设置自动计算的字段,并且上面view里设置为只读 self.price = self.amount * self.unit_price # 可以选择返回警告和域 return { 'warning': { 'title': "Something bad happened", 'message': "It was very bad indeed", } }
*对于计算字段来说,onchange是内置的。