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

Odoo OpenERP 7:单击保存后如何触发自动版本增加功能,odoo,openerp-7,Odoo,Openerp 7,在OpenERP 7中单击“保存”后,如何触发函数 在我的自定义模块中,我希望自动增加“version\u number”参数,用户每次单击save时,它都会触发一个函数来执行“ver=ver+1”的逻辑并写回“version\u number”字段。我怎么能这么做 我尝试使用“def write()”,但不确定具体如何实现。谢谢你的帮助。谢谢 您是对的,您应该将write函数用作 \u列={。。。, “ver”:字段。整型(), ...} def写入(自身、cr、uid、ID、VAL、上下文=

在OpenERP 7中单击“保存”后,如何触发函数

在我的自定义模块中,我希望自动增加“version\u number”参数,用户每次单击save时,它都会触发一个函数来执行“ver=ver+1”的逻辑并写回“version\u number”字段。我怎么能这么做


我尝试使用“def write()”,但不确定具体如何实现。谢谢你的帮助。谢谢

您是对的,您应该将write函数用作

\u列={。。。,
“ver”:字段。整型(),
...}
def写入(自身、cr、uid、ID、VAL、上下文=无)
VAL['ver']=触发器函数()
返回self.super(您的类名称)。写入(cr、uid、VAL、上下文)
编辑 看起来我的回答不够清楚,如果我当时没有检查评论,我很抱歉。但是,因为在较新版本的odoo/openerp中,问题和解决方案是相同的,所以我在这里添加了更多的描述

trigger\u func
不得向数据库写入任何值(无
self.write
self.some\u字段=some\u值
)。它应该只返回version的新值

def触发器功能(self):
返回self.ver+1
对于较新版本的Odoo(V8+),使用相同的触发功能和格式:

@api.multi
def写入(自身、VAL):
VAL['ver']=self.trigger_func()
返回super(你的类名,self).write(VAL)
请注意,这将为所有记录设置相同的版本,您应该使用
self。如果您计划逐个记录更改版本,请确保在
触发器功能的开头使用一个()。如果您想要一个适用于多次写入的解决方案(我建议您更改代码以避免这种情况),您可以使用以下较慢的代码:

@api.multi
def写入(自身、VAL):
如果len(self)>1:
对于rec in self:
记录写入(VAL)
回归自我
其他:
VAL['ver']=self.trigger_func()
返回super(你的类名,self).write(VAL)
如果您想向所有模型添加版本号,另一个解决方案是修补抽象类并添加自动增加魔法域,但这看起来太过分了


无论如何,我认为直接使用光标应该是最后的选择。

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

\u列={。。。,
“ver”:字段。整型(),
...}
def写入(自身、cr、uid、ID、VAL、上下文=无)
VAL['ver']=触发器函数()
返回self.super(您的类名称)。写入(cr、uid、VAL、上下文)
编辑 看起来我的回答不够清楚,如果我当时没有检查评论,我很抱歉。但是,因为在较新版本的odoo/openerp中,问题和解决方案是相同的,所以我在这里添加了更多的描述

trigger\u func
不得向数据库写入任何值(无
self.write
self.some\u字段=some\u值
)。它应该只返回version的新值

def触发器功能(self):
返回self.ver+1
对于较新版本的Odoo(V8+),使用相同的触发功能和格式:

@api.multi
def写入(自身、VAL):
VAL['ver']=self.trigger_func()
返回super(你的类名,self).write(VAL)
请注意,这将为所有记录设置相同的版本,您应该使用
self。如果您计划逐个记录更改版本,请确保在
触发器功能的开头使用一个()。如果您想要一个适用于多次写入的解决方案(我建议您更改代码以避免这种情况),您可以使用以下较慢的代码:

@api.multi
def写入(自身、VAL):
如果len(self)>1:
对于rec in self:
记录写入(VAL)
回归自我
其他:
VAL['ver']=self.trigger_func()
返回super(你的类名,self).write(VAL)
如果您想向所有模型添加版本号,另一个解决方案是修补抽象类并添加自动增加魔法域,但这看起来太过分了


无论如何,我认为直接使用光标应该是最后的选择。

您需要重写
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):
    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

以下是我的
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

我更喜欢你的答案,因为它更完整。但是对于Odoo的旧浏览对象,如果浏览将返回一个browse_null对象,那么最后一行可能会产生错误。有两种可能性:第一个
ids
可能是整数,第二个ids可能有错误的id或者没有。您的代码将试图从browse\u null对象获取
版本号
,这将给出一个错误。@CZoellner,我试过了。这个原始的想法似乎效果更好,但需要稍加修改。我在语句“for record in self.browse(cr,uid,ids):”中遇到错误,我进一步将其更改为reads=self.read(cr,uid,ids,['version'],context=context),并使用ver_num=reads.get('version')@Samleecomp捕获版本。他上一次编辑的版本似乎还可以,而我不喜欢使用直接游标执行。相反,我会在最后一行做'record.write({'version\u number':record.version\u number+1})'。@CZoellner,我仔细考虑了你这个周末的建议,并根据你的建议修改了它(可能不鼓励直接执行游标)。最终,它运行良好。我之前的错误是由于ids错误导致无法运行“自我浏览中的记录”,其中应该是[ids]而不是整数ID。再次感谢罗利和你。我更喜欢你的答案,因为它更完整。但是对于Odoo的旧浏览对象,如果浏览返回一个browse\u null对象,那么最后一行可能会产生错误