Odoo多对多字段增强:GitHub_Trending/se/server-tools m2m_custom_field模块

Odoo多对多字段增强:GitHub_Trending/se/server-tools m2m_custom_field模块

【免费下载链接】server-tools Tools for Odoo Administrators to improve some technical features on Odoo. 【免费下载链接】server-tools 项目地址: https://gitcode.com/GitHub_Trending/se/server-tools

在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目录,包含完整的安装配置:

版本兼容性

该模块兼容Odoo 12.0+版本,最新维护信息可参考README.rst中的 badges:

成熟度许可证代码仓库
BetaAGPL-3OCA/server-tools

总结

base_m2m_custom_field模块通过扩展多对多字段的灵活性,解决了Odoo默认关联表难以自定义的问题。无论是简单的关联排序还是复杂的关系属性管理,该模块都能显著提升开发效率。更多使用示例可参考模块的demo目录或提交issue获取支持。

通过本文介绍的方法,开发者可以轻松实现关联数据的精细化管理,为Odoo系统添加更强大的业务建模能力。

【免费下载链接】server-tools Tools for Odoo Administrators to improve some technical features on Odoo. 【免费下载链接】server-tools 项目地址: https://gitcode.com/GitHub_Trending/se/server-tools

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值