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字段的值更新。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值