📋总是需要自动编号的,物资要编号,档案要编号,怎么在odoo自动编号。
odoo为我们提供了一个很好用的序列号生成工具 ir.sequence ,使用该工具只需要在数据文件中注册一条ir.sequence记录,在模型代码中就可以调用该序列。
在创建用户、订单时,常常需要使用到序列来自动为该记录添加编号。 在odoo中,可以通过使用 ir.sequence 模块来生成序列。
一:代码实现:
1:创建字段
code = fields.Char(string="编码", default=lambda self: _('编码'), index=True, copy=False, tracking=True,readonly=True)
2:为该字段写一个方法
方法详解:
重写create方法,将字段设为只读,点击保存后会生成序列号。
一旦调用ir.sequene模型不管是否使用,ir.sequence记录padding 都会累加,因此产生序列号的地方一般用在模型的create函数中。
#文件头部先导包
from odoo import fields, api, models
@api.model
def create(self, values):
if values.get('code', _('编码')) == _('编码'):
# customer.type:模型
values['code'] = self.env['ir.sequence'].next_by_code('customer.type') or _('编码')
# CustomerType:类名
return super(CustomerType, self).create(values)
3:写序列规则
序列规则详解
创建:
模块下-(创建)data(文件夹)-(创建)ir_sequence_data.xml文件 写以下代码
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="master_data.customer_type_code_seq" model="ir.sequence">
<field name="name">customer_type_code</field>
<field name="code">customer.type</field>
<field name="prefix">%(year)s%(month)s%(day)s</field>
<field name="company_id" eval="False"/>
<field name="padding">4</field>
</record>
</data>
</odoo>
各个参数的作用:
- name - 名字,随便叫什么都行
- code - 调用生成编码的 Key,需保证唯一性。(这里code参数与上面刚刚写的方法的那个next_by_code方法的参数值一致,如果涉及到跨模型的情况推荐将“_”变成“.”,并尽可能简化命名词量或以“模型.id”的形式以确保可以关联上对应的方法。但最好的方法就是模块名+自定义名,这样也便于源码阅读时的可读性,可以增强团队合作的效率和幸福度。)
- prefix - 前缀,可以是固定的字符也可以是组合参数,%(year)s会被解析为%Y,并通过date的strftime函数解析出四位数的年份,month、day...的处理方法都是如此。因此,这里可以写的参数包括year、month、day、y、doy(day of year)、woy(week of year)、weekday、h23、h12、min、sec这10种的组合。还可以添加一些字符串前缀,比如SN,用来标识单据类别。
- padding - 序列递增的位数 ,表示序列号数字部分的位数number_next表示序列号的递增数,比如number_next=1,则下一个序列号比上一个序列号增1。默认从001(取决于位数)开始。
- suffix -后缀
4:manifest文件中注册该xml的data文件
'data': [
'security/ir.model.access.csv',
'data/ir_sequence_data.xml',
'views/视图.xml',
],
注意!这里需要注意位置,odoo非常讲究先后顺序,错误的顺序将直接导致启用新库时出现文件丢失的报错。
5:不要忘记升级模块~
二:web端操作
1:查看当前模块序列号
使用ir.sequence模型序列记录可以很方便的生成唯一指定规则序列号,但是有个缺点就是正常情况下不能查看及修改序列编号。
如果我们又需要查看修改序列号该怎么做呢?首先打开debug开发者模式,然后点击设置--技术--序号,就可以修改指定模型的序列参数。