1.方式一:
为字段添加store=True属性,然后 计算方法加上@api.depend装饰器。
优点: 数据存储在数据库中,没变化的话加载速度快
缺点:加大了数据库的空间消耗,在模块突然升级时,原有的数据并不会触发计算方法。
2.方式二:
为字段设置一个 search 属性,该属性需要绑定一个 方法,在检索时触发
示例:
定义了如下计算字段 :
total = fields.Float("数量", compute="_get_picking_product_qty", search='_search_total')
实现效果:
主要代码:
def get_total_domain(self, operator, value):
domain = {'<': lambda x: x.total < value,
'>': lambda x: x.total > value,
'=': lambda x: x.total == value,
'!=': lambda x: x.total != value,
'<=': lambda x: x.total <= value,
'>=': lambda x: x.total >= value,
}
return domain[operator]
@api.multi
def _search_total(self, operator, value):
recs = self.search(
[('team_id', '=', self.env.context['default_team_id']), ('picking_state', '=', 'assigned')]).filtered(
self.get_total_domain(operator, value))
if recs:
return [('id', 'in', recs.ids)]
其中 operator 是筛选的操作符,value是筛选的值,上述例子中 分别为 >,5
优点:对所有的数据进行计算,即使是模块升级,字段不存储在数据库,能避免加上store=True时不触发计算方法的问题
缺点:在调用 .filtered 方法的时候其实底层还是调用了 字段的计算方法,一旦filtered之后的数据量比较大时,筛选速度会受影响,所以 一般查询时把窗口动作的 domain作为查询条件再进行过滤,然后返回匹配记录集的id列表。