如何在 Odoo 19 中创建序列号
在 Odoo 19 中,序列号对于为各模型的记录提供唯一标识符至关重要。这些标识符可遵循自定义格式(如前缀或填充位数),便于有条理的跟踪记录。序列号在 Odoo 应用中应用广泛,例如发票、订单、产品等场景。
本文将介绍两种创建自定义序列号的方法:一种是通过代码为特定模型定义序列号,另一种是使用 Odoo 内置的设置界面创建。为便于演示,我们将创建一个新的 “图书馆管理” 模块,为图书馆中的每本书分配唯一的参考编号。
一、为什么使用序列号?
使用序列号可确保每条记录都有唯一的标识符,这对于在业务流程中保持清晰性、一致性和可追溯性至关重要。通过为发票、订单或产品分配序列号,企业能够简化记录管理、减少重复项,并加强对交易的管控。这种做法有助于准确跟踪和检索信息、提高报表精度,并实现与其他系统的无缝集成,确保跨平台数据完整性。此外,序列号还能通过提供清晰的审计轨迹支持合规性,预防错误,并便于发现差异或欺诈行为。
二、使用序列号的好处
- 唯一性:确保每条记录都能被明确识别。
- 可追溯性:便于在记录的整个生命周期内对其进行跟踪。
- 可定制性:允许企业定义符合自身品牌和运营需求的格式。
三、方法一:通过代码创建序列号
步骤 1:定义模型
首先,创建需要应用序列号的模型。此处我们将创建一个 library.book 模型(代表图书馆中的书籍),并配置序列号以生成唯一的参考编号。
from odoo import fields, models, api, _
class LibraryBook(models.Model):
_name = 'library.book' # 模型名称
_description = 'Library Book' # 模型描述
name = fields.Char(string="书名", required=True, help="书名")
author = fields.Char(string="作者", required=True, help='书的作者')
isbn = fields.Char(string="ISBN", required=True, help="书的ISBN")
reference_number = fields.Char(string="参考编号", default=lambda self: _('New'), readonly=True, copy=False, help="书的参考编号")
@api.model_create_multi
def create(self, vals_list):
"""批量创建书籍时,为每条记录自动生成参考编号"""
# 遍历vals_list(列表),处理每条记录的vals(字典)
for vals in vals_list:
# 若reference_number字段值为默认的“New”,则生成序列号
if vals.get('reference_number', _('New')) == _('New'):
vals['reference_number'] = self.env['ir.sequence'].next_by_code('library.book') or _('New')
# 调用父类的create方法完成记录创建
return super().create(vals_list)
代码解释:
- reference_number:字符类型字段,默认值为 “New”,用于存储每本书的唯一标识符。
- create:重写模型的创建(create)方法,在每次创建新记录时,为 reference_number 字段分配由序列号生成的标识符。
步骤 2:在 XML 中定义序列
模型配置完成后,需为 library.book 模型定义序列号。可在模块的 data 目录下创建一个 XML 文件来实现。
创建名为 ir_sequence_data.xml 的 XML 文件。
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<data noupdate="1"> <!-- noupdate="1"表示该记录创建后不被模块更新覆盖 -->
<record id="ir_sequence_library_book" model="ir.sequence">
<field name="name">图书馆书籍参考编号</field> <!-- 序列号的描述性名称 -->
<field name="code">library.book</field> <!-- 与模型关联的标识代码 -->
<field name="prefix">LIB</field> <!-- 参考编号的前缀(如“LIB”代表“图书馆”) -->
<field name="padding">5</field> <!-- 序列号的数字部分填充位数(如5位则显示为00001) -->
<field name="number_next">1</field> <!-- 序列号的起始编号 -->
<field name="number_increment">1</field> <!-- 序列号的递增步长 -->
<field name="company_id" eval="False"/> <!-- 不绑定特定公司(全公司通用) -->
</record>
</data>
</odoo>
XML 字段说明:
- id:序列号记录的唯一标识。
- name:序列号的描述性名称(如 “图书馆书籍参考编号”)。
- code:将序列号与 library.book 模型关联的关键代码。
- prefix:参考编号的前缀(如 “LIB”)。
- padding:序列号数字部分的填充位数(如 5 位则生成 “00001”,“00002” 等)。
- number_next:序列号的起始数字。
- number_increment:序列号每次递增的步长(通常为 1)。
- company_id:设置为 False 表示该序列号适用于所有公司,若需绑定特定公司,可指定公司 ID。
步骤 3:测试序列生成
完成模型和序列号的定义后,导航至 library.book 模型(可能需要在模块中为该模型创建菜单)。创建新书籍记录时,填写标题、作者和 ISBN 字段,提交后会发现 “参考编号” 字段已自动填充为唯一标识符,格式如 LIB00001、LIB00002 等。
四、方法二:通过 Odoo 设置菜单创建序列号
若不希望直接编写代码,也可通过 Odoo 界面创建序列号。这种方法适合非技术用户,便于为不同模型管理或创建序列号。
步骤 1:访问序列菜单
进入 Odoo 后台的"设置"。在"技术"下,找到"序列Sequences",然后选择"序列"。
步骤 2:创建新序列
点击"创建"打开一个新的序列号表单,填写以下字段:
- 名称(Name):序列号的描述性名称,如 “图书馆书籍参考编号”。
- 代码(Code):设置为与模型对应的代码,例如 library.book。
- 前缀(Prefix):添加前缀(如 “LIB” 代表图书馆)。
- 填充位数(Padding):输入数字部分的位数(如 5)。
- 下一个编号(Number Next):设置序列号的起始数字。
- 编号增量(Number Increment):定义序列号的递增步长(通常为 1)。
步骤 3:保存并应用
填写完必填字段后,保存序列号配置。此后,每当在 library.book 模型中创建新记录时,Odoo 都会自动应用该序列号,生成唯一标识符。
五、序列号的额外自定义选项
Odoo 序列号提供多种自定义选项,可根据具体需求调整。
1. 为序列号添加日期范围
可将序列号配置为特定日期范围(如每年或每月重置),该功能特别适用于需要按周期跟踪记录的模型(如发票、合同)。
配置方法:在序列号表单中勾选 “按日期范围使用子序列”(Use subsequences per date range)选项,然后在 “日期范围”(Date Range)字段中设置所需周期(如 “月度” 或 “年度”)。
2. 标准模式与无间隔模式(Standard vs. No Gap)
Odoo 允许序列号使用 “标准模式”(Standard)或 “无间隔模式”(No Gap):
- 标准模式(Standard):若序列号被跳过或记录被删除,编号会继续向下一个可用数字递增,可能存在间隔。此模式通常用于会计场景(每个编号对应唯一凭证)。
- 无间隔模式(No Gap):会自动填补缺失的编号,确保序列连续。此模式常用于运营跟踪(缺失标识符可能导致混淆)。
六、总结
在 Odoo 19 中,创建自定义序列号可显著提升各模块的记录管理效率。无论您是倾向于通过代码定义序列号的开发者,还是需要通过设置快速配置的管理员,Odoo 都能提供灵活的解决方案。遵循本文,您可以为任意模型设置序列号,轻松实现记录的有序化和可追溯性。