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.write
或 self.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
在 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.write
或 self.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