You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 01:30:05