版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_29654325/article/details/85054254
计算字段和默认值
我们的大部分字段都是直接在数据库中存储和检索的。其实字段的值也可以通过调用model中的一个方法实时计算。
为了创建计算字段,我们需要创建一个字段并且给它的属性compute指定一个方法,这个计算方法能够对每一条记录直接计算设置值。
计算方法接收的self一般都是记录集,是多条数据的一个集合,而计算方法实际是对每一条记录的对应字段赋值,所以我们一般需要对方法使用@api.multi装饰并且通过for rec in self来循环处理。
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))
依赖
计算字段的值经常需要依赖其他字段的值,我们通过使用@api.depends(‘fields1’,‘fields2’)来装饰计算方法。当依赖的字段被改变的时候,计算字段会被重新计算。
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
默认值
每一个字段都可以拥有一个默认值,在字段定义的时候添加一个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
- 当前登录数据库的用户ID self.env.uid 或者 self._uid
- 当前登录用户的记录对象 self.env.user
- 上下文值字典 self.env.context 或者 self._context
- self.env.ref(xml_id) 返回对应的xml对象的ID - 视图return用的比较多
- self.env[model_name]返回一个模型的实例 不是记录实例