如何在Odoo中实现Integer整数字段的自增操作
Odoo Integer整数字段自增实现方案
你给出的直接赋值var = var + 1的写法不符合Odoo ORM规范,无法直接生效,根据不同的使用场景有以下两种最优实现方式:
场景1:创建记录时自动按序列自增
这是最常用的场景,推荐使用Odoo原生ir.sequence机制实现,自带并发锁,不会出现重复序号问题。
步骤1:在模块data目录新增序列定义XML(比如data/sequence_data.xml)
<odoo> <record id="seq_something_custom" model="ir.sequence"> <field name="name">自定义整数字段自增序列</field> <field name="code">something.custom_seq</field> <field name="number_next">1</field> <field name="number_increment">1</field> <field name="padding">0</field> <field name="prefix"></field> </record> </odoo>
步骤2:在模块的__manifest__.py中注册上述XML文件
{ # 其他 manifest 配置 'data': [ 'data/sequence_data.xml', ], }
步骤3:重写模型create方法,创建记录时自动取序列值
class ExampleModel(models.Model): _name = "something" var = fields.Integer(default=0, string="自增字段") @api.model def create(self, vals): vals['var'] = self.env['ir.sequence'].next_by_code('something.custom_seq') return super().create(vals)
场景2:特定动作触发时自增(比如按钮点击、状态流转)
如果不需要创建时自增,而是某个操作触发时字段加1,按并发程度选择对应写法:
低并发场景:直接ORM操作
def var_add_one(self): self.ensure_one() self.var += 1
高并发场景:用F表达式避免脏读
F表达式会将计数逻辑放在数据库层面执行,避免多个请求同时读取相同值导致的计数错误:
from odoo.osv.expression import F def var_add_one(self): self.ensure_one() self.write({'var': F('var') + 1})
内容的提问来源于stack exchange,提问作者blake_won
相关产品推荐
相关产品推荐

