You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 23:32:05