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

如何在Odoo 9中实现many2many字段的可排序性?

在Odoo 9中实现Many2many字段的可排序功能

我之前也碰到过这个问题,Odoo的many2many字段默认是按照中间关联表的ID顺序或者关联模型的默认排序来展示的,没法直接自定义调整顺序。不过通过以下几个步骤就能轻松实现可排序功能:

1. 给Many2many的中间关联表添加排序字段

Many2many关系是通过自动生成的中间表来存储的,我们需要给这个中间表新增一个sequence字段来控制排序顺序。

假设你的主模型是model.a,关联的模型是model.b,many2many字段名为model_b_ids,那么中间表的名称通常是model_a_model_b_rel(格式为主模型名_关联模型名_rel)。我们可以通过继承这个中间表来添加字段:

from openerp import models, fields

class ModelA(models.Model):
    _name = 'model.a'
    _description = '主模型示例'
    
    # 定义many2many字段时明确指定中间表名称
    model_b_ids = fields.Many2many(
        'model.b', 
        'model_a_model_b_rel', 
        'a_id', 
        'b_id', 
        string="关联的B记录"
    )

# 继承中间关联表,添加排序字段
class ModelAModelBRel(models.Model):
    _name = 'model_a_model_b_rel'
    _inherit = 'model_a_model_b_rel'
    
    sequence = fields.Integer(string="排序序号", default=10)

2. 修改Many2many字段的默认排序规则

接下来,我们要告诉Odoo按照中间表的sequence字段来排序many2many的显示结果。只需要在many2many字段的定义中加上order参数:

model_b_ids = fields.Many2many(
    'model.b', 
    'model_a_model_b_rel', 
    'a_id', 
    'b_id', 
    string="关联的B记录",
    order='model_a_model_b_rel.sequence'  # 新增排序规则
)

3. 在视图中添加可拖动排序的交互

现在我们需要在表单视图中让用户能够直观地拖动调整顺序。使用many2many_list组件,并在子tree视图中添加widget="handle"的sequence字段,这样用户就能通过拖动手柄来调整顺序,系统会自动更新sequence字段的值:

<record id="view_model_a_form" model="ir.ui.view">
    <field name="name">model.a.form</field>
    <field name="model">model.a</field>
    <field name="arch" type="xml">
        <form>
            <sheet>
                <group>
                    <!-- 其他字段 -->
                    <field name="model_b_ids" widget="many2many_list">
                        <tree editable="bottom" default_order="sequence">
                            <field name="sequence" widget="handle" invisible="1"/>
                            <field name="name"/>
                            <!-- 其他关联模型的字段 -->
                        </tree>
                    </field>
                </group>
            </sheet>
        </form>
    </field>
</record>

这里把sequence字段设为invisible="1"是因为我们不需要显示序号,只需要用它来控制排序逻辑,用户通过拖动手柄就能调整顺序。

4. 处理已有数据(可选)

如果你的系统中已经存在很多关联记录,这些记录的sequence字段可能都是默认值10,这时候排序会混乱。你可以写一个简单的脚本或者通过数据库批量更新,给已有记录设置递增的sequence值,比如:

UPDATE model_a_model_b_rel 
SET sequence = id 
WHERE sequence = 10;

这样就能让已有记录按照原来的ID顺序初始化排序序号。

完成以上步骤后,你的many2many字段就支持自定义排序了,用户可以通过拖动来调整关联记录的显示顺序,系统会自动保存排序规则~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:15:25