如何在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

