Odoo 17 添加序列遇问题求助:字段错误及默认值不更新
Odoo 17 序列计数器配置问题
问题背景
参考旧版示例在Odoo 17中实现字段计数器时遇到以下问题:
- 初始代码激活模块时提示**"the field sequence"不可用**;
- 将Python字段定义从旧版
_columns语法改为Odoo 17新语法后,XML中<record id="debitor_counter_sequence_type" model="ir.sequence.type">节点出现解析错误; - 调整代码后无报错,但字段始终显示默认值
-1,无法生成自增序列。
已手动在设置->技术->序列中添加对应序列,但问题依旧。
当前代码
DebitCard.py
from odoo import models, fields, api class DebitCard(models.Model): _name="debit.card" _description="Debit Card" name = fields.Char(string="Debit Card Datev Sequence", default="-1", readonly=True) @api.model def create(self, vals): vals['name'] = self.env['ir.sequence'].next_by_code('debit.card.sequence.code') result = super(DebitCard,self).create(vals) return result
XML配置文件
<?xml version="1.0" encoding="utf-8"?> <data> <record id="debit_card_datev_sequence" model="ir.sequence"> <field name="name">Debit Card Datev Sequence</field> <field name="code">debit.card.sequence.code</field> </record> </data> </odoo>
解决方案
1. 修复Python代码缩进错误
create方法未缩进,不属于DebitCard类,导致Odoo调用默认create方法,不会执行序列赋值逻辑。修正后代码:
from odoo import models, fields, api class DebitCard(models.Model): _name="debit.card" _description="Debit Card" name = fields.Char(string="Debit Card Datev Sequence", default="-1", readonly=True) @api.model def create(self, vals): # 增加空值判断,避免序列获取失败时字段为空 vals['name'] = self.env['ir.sequence'].next_by_code('debit.card.sequence.code') or "-1" result = super(DebitCard,self).create(vals) return result
2. 完善序列XML配置
Odoo 17中ir.sequence需指定必要参数才能正常生成序列,同时规范序列类型定义:
<?xml version="1.0" encoding="utf-8"?> <odoo> <data> <!-- 定义序列类型(规范配置,可选但推荐) --> <record id="debit_card_sequence_type" model="ir.sequence.type"> <field name="name">Debit Card Sequence Type</field> <field name="code">debit.card.sequence.code</field> </record> <!-- 定义具体序列 --> <record id="debit_card_datev_sequence" model="ir.sequence"> <field name="name">Debit Card Datev Sequence</field> <field name="code">debit.card.sequence.code</field> <field name="sequence_type_id" ref="debit_card_sequence_type"/> <field name="implementation">standard</field> <field name="prefix">DC-</field> <!-- 自定义序列前缀 --> <field name="padding">4</field> <!-- 序列数字位数,如0001 --> <field name="company_id" eval="False"/> <!-- 单公司环境设为False,多公司可指定对应公司 --> </record> </data> </odoo>
3. 验证序列配置一致性
确保手动添加的序列代码与next_by_code中使用的debit.card.sequence.code完全一致,且序列处于激活状态。
4. 日志排查(可选)
若仍未解决,可在create方法中添加日志,确认序列是否成功获取:
import logging _logger = logging.getLogger(__name__) @api.model def create(self, vals): sequence = self.env['ir.sequence'].next_by_code('debit.card.sequence.code') _logger.info("Generated sequence: %s", sequence) vals['name'] = sequence or "-1" result = super(DebitCard,self).create(vals) return result
通过Odoo日志查看序列生成情况,定位问题。
内容的提问来源于stack exchange,提问作者Taucher
相关产品推荐
相关产品推荐

