Odoo多对多字段增强:GitHub_Trending/se/server-tools m2m_custom_field模块
在Odoo开发中,多对多(Many2many)字段是关联两个模型记录的常用方式,但默认实现的关联表往往缺乏灵活性。本文将介绍如何通过base_m2m_custom_field模块解决这一痛点,实现关联表的自定义管理。
模块概述
base_m2m_custom_field模块扩展了Odoo的多对多字段功能,允许开发者通过create_table属性控制关联表的创建,从而直接操作关联表数据。该模块适用于需要在专用树视图中编辑关联关系的场景,如复杂权限控制或额外关联属性管理。
核心功能
关联表创建控制
通过设置create_table=False,可禁用Odoo自动生成的关联表,转而使用自定义模型管理关联关系。核心实现位于fields.py:
class Many2manyCustom(fields.Many2many):
create_table = True # 默认自动创建关联表
def update_db(self, model, columns):
if not self.create_table:
return # 禁用自动创建
return super().update_db(model, columns)
自定义关联模型
当禁用自动关联表后,需定义继承自models.Model的关联模型,并在视图中配置可编辑列表。典型应用场景包括:
- 关联记录排序
- 添加关联时间戳
- 定义关联权重或优先级
使用步骤
1. 定义模型关系
在模型中使用Many2manyCustom字段替代默认Many2many,并禁用自动表创建:
# models/example.py
from odoo import models, fields
class MyModelA(models.Model):
_name = 'my.model.a'
my_model_b_ids = fields.Many2manyCustom(
'my.model.b',
'my_model_a_b_rel', # 关联表名称
'my_model_a_id',
'my_model_b_id',
create_table=False # 禁用自动创建
)
class MyModelB(models.Model):
_name = 'my.model.b'
my_model_a_ids = fields.Many2manyCustom(
'my.model.a',
'my_model_a_b_rel',
'my_model_b_id',
'my_model_a_id',
create_table=False
)
2. 创建关联模型
定义关联表对应的模型,添加必要的索引和额外字段:
# models/relation.py
class MyModelABRel(models.Model):
_name = 'my.model.a.b.rel' # 名称需与关联表一致
my_model_a_id = fields.Many2one(
'my.model.a',
required=True,
index=True # 必须添加索引
)
my_model_b_id = fields.Many2one(
'my.model.b',
required=True,
index=True
)
# 可添加额外字段如:
sequence = fields.Integer("排序权重")
create_date = fields.Datetime("关联时间")
3. 配置视图
在XML视图中定义关联模型的可编辑列表:
<!-- views/relation_views.xml -->
<record id="rel_list_view" model="ir.ui.view">
<field name="name">my.model.a.b.rel.list</field>
<field name="model">my.model.a.b.rel</field>
<field name="arch" type="xml">
<list editable="top">
<field name="my_model_a_id"/>
<field name="my_model_b_id"/>
<field name="sequence"/>
</list>
</field>
</record>
应用场景
场景1:项目-成员关联管理
在项目管理系统中,通过自定义关联表实现成员角色分配和排序:
# 项目模型
class Project(models.Model):
_name = 'project'
member_ids = fields.Many2manyCustom(
'res.users',
'project_member_rel',
create_table=False
)
# 关联模型
class ProjectMemberRel(models.Model):
_name = 'project.member.rel'
project_id = fields.Many2one('project', index=True)
user_id = fields.Many2one('res.users', index=True)
role = fields.Selection([
('lead', '负责人'),
('dev', '开发者'),
('tester', '测试者')
])
场景2:产品标签权重设置
电商系统中,为产品标签添加展示优先级:
class Product(models.Model):
_name = 'product.product'
tag_ids = fields.Many2manyCustom(
'product.tag',
'product_tag_rel',
create_table=False
)
class ProductTagRel(models.Model):
_name = 'product.tag.rel'
product_id = fields.Many2one('product.product')
tag_id = fields.Many2one('product.tag')
priority = fields.Integer(default=10) # 排序权重
模块安装与维护
安装路径
模块位于项目的base_m2m_custom_field目录,包含完整的安装配置:
- 清单文件:manifest.py
- 权限配置:security/ir.model.access.csv
版本兼容性
该模块兼容Odoo 12.0+版本,最新维护信息可参考README.rst中的 badges:
| 成熟度 | 许可证 | 代码仓库 |
|---|---|---|
| Beta | AGPL-3 | OCA/server-tools |
总结
base_m2m_custom_field模块通过扩展多对多字段的灵活性,解决了Odoo默认关联表难以自定义的问题。无论是简单的关联排序还是复杂的关系属性管理,该模块都能显著提升开发效率。更多使用示例可参考模块的demo目录或提交issue获取支持。
通过本文介绍的方法,开发者可以轻松实现关联数据的精细化管理,为Odoo系统添加更强大的业务建模能力。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



