odoo下compute字段随触发器计算保存

  环境: odoo9

模型关系

有一个业务核心表(不开放给用户),另一个(查询)表是对核心表的数据进行处理并展现给用户

需求

现在需要对查询表的计算字段进行存储,面临什么时候触发改变相应的字段值。odoo8(openerp)以前,有function 字段,并且store 属性提供字典形式写法,用来实现触发器

store = {    'object_name': (            function_name,            ['field_name1', 'field_name2'],            priority)}

在odoo 8以上,store 只支持bool型, 怎么给computed字段增加一个触发器算是一个问题。

实现

在stackoverflow上找到一篇跟我一样问题的问答: How to set store trigger for computed fields in Odoo 8?

这里的实现方式是用depends来实现触发器,来看新api对depends的描述:

This decorator will trigger the call to the decorated function if any of the fields specified in the decorator is altered by ORM or changed in the form

但需要特别注意的一点,depends依赖的字段 是来自其他模型的字段时,需要现在本模块中建立相关关系。

eg:

核心表 hr.holiday.move查询表 hr.holiday.inquiry在查询表中新增move字段,这个字段只被depends使用,并不表示实际的模型关系move = fields.Many2one('hr.holiday.move')然后就可以使用了:@api.depends('move.credit')def _quota_compute(self):   pass    

更多

其实新api 的depends 只依赖本模型的字段时,这个还蛮好用。 但是如果该值依赖其他多个模块的字段变化时,这时depends没有老api那么方便了。

用 depends时, 需要去建相关的关联,但是 可能因为业务关系,不能建立随意建立那么多关联,或者关联值设置的时机不对,都不会正确适当的触发depends。

面对这种复杂的情况时,还是用老api 来实现。 可以参看相关代码

function 字段:

    'used_num': fields.function(_used_num_compute, type="float", digits=(12, 2), string='Used Num', store={        'hr.holiday.move': (lambda self, cr, uid, ids, c={}: ids, ['debit', 'status'], 10),        'hr.holiday.move.reconcile': (lambda self, cr, uid, ids, c={}: ids, ['num'], 10)    }),

调用方法:

def _used_num_compute(self, cr, uid, ids, field_name, arg, context=None):    pass

因为function字段的变化 依赖 store 中的触发器。 故此,想要在其他地方改变该值,用系统orm是不可能实现的。 这里需要直接操作sql 语句来对function字段的值更新。

关键字:odoo

版权声明

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部