如何在 Odoo 19 中创建序列
你是否好奇过,Odoo 是如何自动以整洁、递增的方式生成采购订单、销售订单和发票编号的?序列就是实现这一功能的核心。无论你是在开发自定义应用,还是扩展现有模块,创建专属序列都是每个 Odoo 开发者必备的关键技能。
本教程将教你通过**前端(Odoo 界面)和 代码(Python + XML)**两种方式,在 Odoo 19 中创建自定义序列号。学完后,你将能够为自定义模块中的任意模型生成唯一标识符。

第一步:通过代码创建序列
你可以在自定义模块中通过 XML 定义序列,再通过 Python 在需要时调用该序列。
XML:定义序列规则
在你的模块中创建文件,路径为 data/sequence_data.xml:
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 模型中获取下一个编号。
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 数据文件:
python
'data': [
'data/sequence_data.xml',
],
第二步:通过 Odoo 前端界面(UI)创建序列
如果你不想编写代码,Odoo 支持直接在界面中创建序列:
进入路径:设置 > 技术 > 序列与标识符 > 序列
点击创建 ,并填写下表中的字段:

| 字段 | 用途 |
|---|---|
| 名称 | 序列的自定义名称 |
| 实现方式 | 下拉选项:标准、无间隔 |
| 序列编码 | 唯一的技术编码 |
| 前缀 | 序列记录的前缀值 |
| 后缀 | 序列记录的后缀值 |
| 序列长度 | Odoo 会自动在"下一个编号"左侧补 0,达到指定长度 |
| 下一个编号 | 序列的起始值 |
| 增量 | 序列编号的递增步长 |
| 公司 | 设置后按公司生效(多公司环境) |
分配序列号时,无间隔序列模式会确保已分配所有前置序列号。该模式不会在分配时跳过编号,但删除记录仍会产生间隔。此外,无间隔模式的性能比标准序列模式更慢。
注意 :通过 Odoo 界面创建的序列不会自动应用 到自定义模型。若要使用该序列,必须重写模型的 create() 方法,并通过 ir.sequence.next_by_code() 生成序列。
通过界面创建的序列后续可直接编辑,调整格式、前缀、长度或重置规则,无需修改模型代码。
在 Odoo 19 中创建序列既强大又灵活。你可以通过代码定义序列,实现模块跨环境的可移植性;也可以直接在前端配置,实现快速设置。序列能帮助你在业务流程中保持数据的有序性和一致性。
在 Odoo 19 中,序列是维持系统内记录标识有序、统一、唯一的核心组件。无论你通过代码配置(实现更精准的控制和可移植性),还是通过界面设置(实现快速修改),序列都能满足实际业务流程的灵活需求。
掌握前缀、长度、日期格式、实现类型的配置方法,你就能创建实用、可扩展的序列。精通序列不仅能优化数据结构,还能让你的 Odoo 应用更专业、更易追溯。
总结
- 代码创建序列:XML 定义规则 + Python 重写create方法调用,适合模块开发、跨环境迁移
- 界面创建序列:可视化配置,无需代码,适合快速修改和调整
- 序列核心参数:编码(唯一标识)、前缀/后缀、长度、起始号、递增步长