Skip to Content

Odoo 19 序列创建指南:前端界面与代码(Python+XML)实现详解

      你是否好奇过,Odoo 是如何自动以整洁、递增的方式生成采购订单、销售订单和发票编号的?序列就是实现这一功能的核心。无论你是在开发自定义应用,还是扩展现有模块,创建专属序列都是每个 Odoo 开发者必备的关键技能。

       本教程将教你通过**前端(Odoo 界面)代码(Python + XML)**两种方式,在 Odoo 19 中创建自定义序列号。学完后,你将能够为自定义模块中的任意模型生成唯一标识符。


第一步:通过代码创建序列

你可以在自定义模块中通过 XML 定义序列,再通过 Python 在需要时调用该序列。

XML:定义序列规则

在你的模块中创建文件,路径为 data/sequence_data.xml:

<?xml version="1.0" encoding="UTF-8"?>
<odoo>
    <data noupdate="1">
        <record id="seq_custom_model" model="ir.sequence">
            <field name="name">自定义序列</field>
            <field name="implementation">standard</field>
            <field name="code">custom.model</field>
            <field name="prefix">CUST/%(year)s/</field>
            <field name="suffix">CUST/%(year)s/</field>
            <field name="number_next_actual">10/</field>
            <field name="padding">5</field>
            <field name="number_next">1</field>
            <field name="number_increment">1</field>
            <field name="company_id" eval="False"/>
        </record>
    </data>
</odoo>

参数说明

  • name:序列的可读名称
  • code:技术编码(Python 中通过该编码获取下一个编号)
  • prefix:序列前缀(如年份、固定文本)
  • suffix:序列后缀(如年份、固定文本)
  • padding:数字位数(例如 5 表示生成 00001、00002 等格式)
  • number_next_actual:起始编号(默认:1)
  • number_increment:编号递增步长(默认:1)
  • company_id:设置后按公司生效(适用于多公司环境)
  • implementation:分配序列号时,no gap(无间隔)模式会确保已分配所有前置序列号,该模式不会在分配时跳过编号,但删除记录仍会产生间隔,且性能比 standard(标准)模式更慢

日期时间格式变量

年份格式

  • 带世纪的当前年份 (%(year)s):显示完整年份(如 2026)
  • 不带世纪的当前年份 (%(y)s):显示年份后两位(如 26)

月份与日期

  • 月份 (%(month)s):以数字显示当前月份(01–12)
  • 日期 (%(day)s):以数字显示当月日期(01–31)
  • 一年中的第几天 (%(doy)s):显示年内天数(001–366)

周信息

  • 一年中的第几周 (%(woy)s):显示年内周数(00–53)
  • 星期几 (%(weekday)s):以数字显示星期(0–6,周一=0)

时间格式

  • 24小时制小时 (%(h24)s):显示 00–23 小时
  • 12小时制小时 (%(h12)s):显示 01–12 小时
  • 分钟 (%(min)s):显示当前分钟(00–59)
  • 秒 (%(sec)s):显示当前秒数(00–59)

ISO 8601 日期标准

  • ISO 带世纪年份 (%(isoyear)s):显示 ISO 周制年份(如 2026)
  • ISO 不带世纪年份 (%(isoy)s):显示 ISO 年份后两位
  • ISO 周数 (%(isoweek)s):显示 ISO 周数(01–53)

Python:调用序列

在你的模型文件中(例如 models/custom_model.py):

使用相同的编码(ir.sequence.next_by_code('编码'))在 Python 模型中获取下一个编号。

# -*- coding: utf-8 -*-
from odoo import api, fields, models

class CustomModel(models.Model):
    _name = 'custom.model'
    _description = '带有序列的自定义模型'
    name = fields.Char(string='编号', required=True, copy=False, readonly=True,
                       default=lambda self: '新建')
    description = fields.Text(string="描述")
    
    @api.model_create_multi
    def create(self, vals):
        """ 重写创建方法,为自定义模型记录应用序列编码 """
        if vals.get('name', '新建') == '新建':
            vals['name'] = self.env['ir.sequence'].next_by_code('custom.model') or '新建'
        return super(CustomModel, self).create(vals)

更新 manifest.py

确保在清单文件中加载你的 XML 数据文件:

'data': [
    'data/sequence_data.xml',
],

第二步:通过 Odoo 前端界面(UI)创建序列

如果你不想编写代码,Odoo 支持直接在界面中创建序列:

进入路径:设置 > 技术 > 序列与标识符 > 序列

点击创建,并填写下表中的字段:

字段用途
名称序列的自定义名称
实现方式下拉选项:标准、无间隔
序列编码唯一的技术编码
前缀序列记录的前缀值
后缀序列记录的后缀值
序列长度Odoo 会自动在“下一个编号”左侧补 0,达到指定长度
下一个编号序列的起始值
增量序列编号的递增步长
公司设置后按公司生效(多公司环境)

分配序列号时,无间隔序列模式会确保已分配所有前置序列号。该模式不会在分配时跳过编号,但删除记录仍会产生间隔。此外,无间隔模式的性能比标准序列模式更慢。

注意:通过 Odoo 界面创建的序列不会自动应用到自定义模型。若要使用该序列,必须重写模型的 create() 方法,并通过 ir.sequence.next_by_code() 生成序列。

通过界面创建的序列后续可直接编辑,调整格式、前缀、长度或重置规则,无需修改模型代码。

在 Odoo 19 中创建序列既强大又灵活。你可以通过代码定义序列,实现模块跨环境的可移植性;也可以直接在前端配置,实现快速设置。序列能帮助你在业务流程中保持数据的有序性和一致性。

在 Odoo 19 中,序列是维持系统内记录标识有序、统一、唯一的核心组件。无论你通过代码配置(实现更精准的控制和可移植性),还是通过界面设置(实现快速修改),序列都能满足实际业务流程的灵活需求。

掌握前缀、长度、日期格式、实现类型的配置方法,你就能创建实用、可扩展的序列。精通序列不仅能优化数据结构,还能让你的 Odoo 应用更专业、更易追溯。

总结

  1. 代码创建序列:XML 定义规则 + Python 重写create方法调用,适合模块开发、跨环境迁移
  2. 界面创建序列:可视化配置,无需代码,适合快速修改和调整
  3. 序列核心参数:编码(唯一标识)、前缀/后缀、长度、起始号、递增步长

.

Odoo 19 序列创建指南:前端界面与代码(Python+XML)实现详解
中国 Odoo, 苏州远鼎 April 12, 2026
Tags
Archive