You need to enable JavaScript to run this app. Odoo12看板default_group_by分组Selection字段自定义阶段排序
优惠活动
大模型
产品
解决方案
定价
更多

Odoo12看板default_group_by分组Selection字段自定义阶段排序

Odoo 看板视图按Selection字段自定义阶段排序实现方案

Odoo默认对Selection类型字段的分组排序逻辑为按字段的展示标签文本做字典序排序,而非按照Selection元组的定义顺序排列,这也是看板阶段排序和预期业务流程错位的根本原因。可根据开发成本和场景需求,选择以下三种可落地的实现方案:

方案1:重写模型read_group方法(无额外视图配置成本)

  • 实现原理:看板视图发起分组请求时会触发模型的read_group接口,通过重写该方法拦截按state字段的分组返回结果,按照业务预期的阶段优先级重新排列分组列,完全不修改原有字段、视图的核心配置。
  • 模型层代码示例:
from odoo import models, api

class Sprint(models.Model):
    _name = 'sprint'
    # 原有state字段定义完全保留,无需调整
    state = fields.Selection([
        ('draft', 'Draft'),
        ('open', 'Open'),
        ('pending', 'Pending'),
        ('cancel', 'Cancelled'),
        ('done', 'Done')],
        'State',
        default='draft'
    )

    @api.model
    def read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True):
        # 仅拦截按state字段分组的请求,其他分组逻辑走原生流程
        if groupby and groupby[0] == 'state':
            # 定义阶段排序优先级,数值越小排越靠前
            state_priority = {
                'draft': 1,
                'open': 2,
                'pending': 3,
                'cancel': 4,
                'done': 5
            }
            group_result = super().read_group(
                domain, fields, groupby,
                offset=offset, limit=limit,
                orderby=orderby, lazy=lazy
            )
            # 按照优先级对返回的分组结果重新排序
            group_result.sort(key=lambda item: state_priority.get(item.get('state')[-1], 999))
            return group_result
        return super().read_group(
            domain, fields, groupby,
            offset=offset, limit=limit,
            orderby=orderby, lazy=lazy
        )
  • 方案优势:一次配置即可让所有按state字段分组的看板、列表视图都遵循自定义排序规则,无需在每个视图中重复配置,维护成本最低。

方案2:看板视图内置分组配置(适配Odoo 14+版本)

  • 实现原理:利用新版Odoo看板视图原生支持的分组节点显式定义能力,在视图配置中按业务顺序手动声明每个阶段分组的展示位置。
  • 修改后的视图XML代码示例:
<kanban string="Kanban Sprint" 
        default_group_by="state"
        groups="state">
    <field name="name"/>
    <field name="state"/>
    <!-- 按业务预期顺序依次声明每个分组的展示位置 -->
    <group name="draft" string="Draft" default_open="1"/>
    <group name="open" string="Open"/>
    <group name="pending" string="Pending"/>
    <group name="cancel" string="Cancelled"/>
    <group name="done" string="Done"/>
</kanban>
  • 注意事项:该配置仅对当前看板视图生效,不影响其他视图的分组排序;如果后续Selection字段新增了选项,需要同步在group节点中补充对应配置,否则新增的分组会被排到所有已定义节点的最右侧。

方案3:联动存储型排序字段(适配复杂流程场景)

  • 实现原理:新增一个带存储的整数类型辅助字段,和原Selection字段建立联动映射,在Selection值变更时自动同步对应阶段的排序权重,后续分组直接按照该数值字段排序即可。
  • 模型层代码示例:
class Sprint(models.Model):
    _name = 'sprint'
    # 原有state字段保持不变
    state = fields.Selection([
        ('draft', 'Draft'),
        ('open', 'Open'),
        ('pending', 'Pending'),
        ('cancel', 'Cancelled'),
        ('done', 'Done')],
        'State',
        default='draft'
    )
    # 新增存储型排序权重字段,需开启store属性才能参与分组排序
    state_sequence = fields.Integer(
        string="阶段排序权重",
        compute='_compute_state_sequence',
        store=True
    )

    @api.depends('state')
    def _compute_state_sequence(self):
        state_weight_map = {
            'draft': 10,
            'open': 20,
            'pending': 30,
            'cancel': 40,
            'done': 50
        }
        for record in self:
            record.state_sequence = state_weight_map.get(record.state, 999)
  • 视图配置调整:将原有default_group_by="state"替换为default_group_by="state_sequence",在看板卡片渲染中保留state字段的展示逻辑。由于state_sequence和state是一一映射的,最终分组展示效果和直接按state字段分组完全一致。
  • 方案优势:排序逻辑最稳定,不受Odoo版本内置排序规则变更的影响,适合有复杂跨阶段排序需求的业务场景。

注意:单纯调整Selection元组的代码定义顺序不会改变默认的分组排序结果,因为Odoo内置的排序逻辑是基于标签文本的字典序实现,和代码中元组的书写顺序无绑定关系。

内容的提问来源于stack exchange,提问作者NgoDucHan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.06 14:24:03