Odoo OpenERP 7:单击保存后如何触发自动版本增加功能
在OpenERP 7中单击“保存”后,如何触发函数 在我的自定义模块中,我希望自动增加“version\u number”参数,用户每次单击save时,它都会触发一个函数来执行“ver=ver+1”的逻辑并写回“version\u number”字段。我怎么能这么做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、上下文=
我尝试使用“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对象,那么最后一行可能会产生错误