Odoo序列生成异常:调用ir.sequence仅返回'/'的原因排查
Odoo序列生成仅返回'/'的问题排查与解决
你在开发图书馆卡片模型时,明明写了自动生成卡号的逻辑,但实际得到的只有'/',这个问题我太熟悉了,咱们一步步拆解原因并解决:
核心原因
你的代码里用了self.env['ir.sequence'].next_by_code('library.card.number') or '/',当next_by_code方法找不到对应代码的序列时,会返回None,这时候就触发了or '/',最终显示成了'/'。本质问题就是你指定的序列代码library.card.number在Odoo系统中还未创建,或者配置不匹配。
解决步骤
1. 确认序列是否存在
首先要打开开发者模式(后台右上角头像里选择"激活开发者模式"),然后进入设置 → 技术 → 序列 → 序列与标识符,在搜索框里搜索library.card.number,检查系统中是否有对应的序列记录。
2. 创建缺失的序列
如果搜索不到,就手动创建一个:
- 点击"创建"按钮,重点填写以下字段:
- 序列代码:必须和你代码里的
library.card.number完全一致,大小写也不能出错 - 名称:取个易识别的名字,比如"图书馆卡号序列"
- 前缀:可按需设置,比如想生成
LIB-0000001格式就填LIB- - 下一个号码:默认填1即可
- 填充零:因为你卡号长度设为7,若无前缀直接填7,数字部分会自动补零到7位;有前缀则根据剩余位数填写
- 实现:选择"标准"选项
- 序列代码:必须和你代码里的
3. 修正代码中的小细节
另外你代码里有几个Odoo字段参数的大小写问题,Odoo字段参数要求小写,比如String要改成string,Translate改成translate,修正后的完整代码片段:
class cardInfo(models.Model): _name = "library.card" card_number = fields.Char(string="Card Number", size=7, translate=True, readonly=True) user_name = fields.Many2one('student.student', string="Name") card_type = fields.Selection([('s', 'Student'), ('l', 'Staff')], string="Card Type") number_of_book_limit = fields.Integer(string="No Of Book Limit", default=0) @api.model def create(self, vals): seq = self.env['ir.sequence'].next_by_code('library.card.number') or '/' vals['card_number'] = seq return super(cardInfo, self).create(vals)
4. 测试验证
重启Odoo服务,更新你的模块,然后尝试创建新的图书馆卡片,这时候应该就能正常生成序列卡号了。
内容的提问来源于stack exchange,提问作者shyamli
相关产品推荐
相关产品推荐

