OpenERP 7 : 如何在点击保存后触发自动版本增加功能

OpenERP 7 : How to trigger a auto version increase function after click save

在 OpenERP 7 中点击保存后如何触发函数?

在我的自定义模块中,我希望自动增加 "version_number" 参数,每次用户单击保存时都会触发一个函数来执行 "ver=ver+1" 的逻辑并写回 "version_number" 字段。我该怎么做?

我尝试使用 "def write()" 但不确定具体如何操作。感谢您的帮助。谢谢!

你是对的,你应该使用 write 函数作为。

    _columns={...,
          'ver':fields.integer(),
        ...}

    def write(self, cr, uid, ids, vals, context=None)
        vals['ver']= trigger_func()
        return self.super(your_class_name).write(cr, uid, vals, context)   

编辑 看来我的回答不够清楚,如果我当时没有检查评论,抱歉。但是因为问题和解决方案在新版本odoo/openerp中都是一样的,所以我在这里添加更多的描述。

trigger_func 不能向数据库写入任何值(没有 self.writeself.some_field=some_value)。它应该只是 return 版本的新值。

def trigger_func(self):
    return self.ver + 1

对于较新版本的 Odoo (V8+),使用相同的格式触发函数和:

@api.multi
def write(self,vals):
     vals['ver'] = self.trigger_func()
     return super(YourClassName, self).write(vals)

请注意,这将为所有记录设置相同的版本,如果您打算逐个记录更改版本,则应在 trigger_func 的开头使用 self.ensure_one()。如果你想要一个适用于多写的解决方案(我建议更改你的代码以避免它)你可以使用这个较慢的代码:

@api.multi
def write(self,vals):
    if len(self)>1:
        for rec in self:
            rec.write(vals)
        return self
    else:
        vals['ver'] = self.trigger_func()
        return super(YourClassName, self).write(vals)

如果你想为所有模型添加版本号,另一种解决方案是修补摘要 class 并添加一个自动增加魔法字段,但它看起来太过分了。

反正我觉得直接用游标应该是不得已的办法了

您需要覆盖 write 方法。

def write(self, cr, uid, ids, vals, context=None):
    res = super(your_model, self).write(cr, uid, ids, vals, context)
    self._increment_version(cr, uid, ids)
    return res

def _increment_version(self, cr, uid, ids):
    for record in self.browse(cr, uid, ids):
        cr.execute('update table_name set version_number=%s where id=%s' % (record.version_number + 1, record.id))

这是对我有用的 write 方法

def write(self, cr, uid, ids, vals, context=None):
    res = super(your_model, self).write(cr, uid, ids, vals, context)
    self._increment_version(cr, uid, ids)
    return res

def _increment_version(self, cr, uid, ids):
    res = {}
    reads = self.read(cr, uid, ids, ['version'], context=context)
    ver_num = reads.get('version')
    ver_id = reads.get('id')
    if ver_num:        
        cr.execute('update table_name set version_number=%s where id=%s' % (ver_num + 1, ver_id))
    return res