odoo中Many2one的那些事

1、去掉创建并编辑

在form的字段中加入option属性,例如:

<field name="company_id"  options="{'no_create_edit': True}"/>

2、对many2one的值进行筛选

使用onchange对下拉框的值进行过滤

@api.onchange('company_id')
    def company_id_onchange(self):
    	#创建一个集合,将符合条件的值添加进去
        company_id_list = []
        for rec in self.env['hr.employee'].search([('marketing_role_id', '!=', None)]).ids:
        	#将符合条件的值逐个添加
            company_id_list.append(rec)
        #通过domain过滤到res集合,将res集合返回回去
        #因为many2one存放的值是字典类型的
        #而这个domain返回回去的值就是一个字典
        res = {'domain': {'marketing_emp_id': [('id', 'in', company_id_list)]}}
        return res
<think>我们正在处理用户关于OdooOne2many字段类型的问题。根据用户的要求,我们需要提供详细解释和使用示例,并遵循系统级指令(如LaTeX格式、中文回答等)。同时,我们需要生成相关问题。 参考引用: - 引用[1]:介绍了关联字段的基本类型(Many2one, One2many, Many2many)以及related参数。 - 引用[2]:详细解释了三种关联字段,特别说明了One2manyMany2one的关系,以及它们如何一起使用。同时提到Many2many会生成辅助表。 - 引用[3]:给出了One2many字段的定义格式和参数说明(comodel_name, inverse_name, domain, context等)。 - 引用[4]:补充了One2many的定义和参数,并提到关系型字段的domain用法以及其他参数(readonly, required, string等)。 用户问题:理解Odoo平台中One2many字段类型的作用和使用方式,要求详解及使用示例。 回答结构: 1. 解释One2many字段的作用(一对多关系)。 2. 详细说明字段定义和参数(参考引用[3]和[4])。 3. 提供Python代码示例(模型定义)和XML视图示例(如何显示)。 4. 解释One2manyMany2one的关系(参考引用[2])。 5. 生成相关问题。 注意:使用中文回答,数学表达式(如果有)使用$...$,独立公式用$$...$$(但本问题可能较少涉及数学公式,主要涉及代码和概念)。 我们开始构建回答。</think>### Odoo One2many字段类型详解及使用示例 #### 1. **One2many字段的作用** One2many字段用于建立**一对多关系**,表示一个主模型记录可关联多个从模型记录。例如: - 一个客户(主模型)可拥有多个订单(从模型) - 一张发票(主模型)可包含多个发票行(从模型) 其本质是**Many2one的反向关系**(引用[2])。当主模型定义One2many字段时,从模型必须存在对应的Many2one字段来存储关联关系(引用[4])。 #### 2. **字段定义语法** ```python field_name = fields.One2many( comodel_name='从模型名称', # 关联的模型(如'sale.order') inverse_name='关联字段名', # 从模型中指向主模型的Many2one字段 string='字段显示标签', # 界面显示的字段名称 domain=[('字段','运算符',值)], # 筛选关联记录的域条件(可选) auto_join=False, # 是否自动JOIN查询(默认False) limit=100 # 读取记录数限制(可选) ) ``` **关键参数说明**(引用[3][4]): - `comodel_name`:关联的从模型名称(字符串) - `inverse_name`:从模型中定义的Many2one字段名,用于反向关联 - `domain`:过滤条件,例如`domain="[('state','=','confirmed')]"`只显示已确认记录 - `context`:传递上下文信息(如默认值) - `auto_join`:启用可优化复杂查询,但可能影响性能 - `limit`:限制加载的记录数量 #### 3. **使用示例 **场景**:定义客户模型(`res.partner`)与订单模型(`sale.order`)的一对多关系。 **步骤1:在从模型中定义Many2one字段** ```python # 订单模型(sale.order.py) class SaleOrder(models.Model): _name = 'sale.order' partner_id = fields.Many2one( comodel_name='res.partner', # 关联客户模型 string='客户', ondelete='cascade' # 客户删除时级联删除订单 ) ``` **步骤2:在主模型中定义One2many字段** ```python # 客户模型(res.partner.py) class ResPartner(models.Model): _inherit = 'res.partner' order_ids = fields.One2many( comodel_name='sale.order', # 关联订单模型 inverse_name='partner_id', # 对应订单模型中的partner_id字段 string='历史订单', domain=[('state','=','done')] # 只显示已完成的订单 ) ``` **步骤3:XML视图显示关联记录** ```xml <!-- 客户表单视图 --> <record id="view_partner_form" model="ir.ui.view"> <field name="arch" type="xml"> <form> <sheet> <field name="name"/> <field name="order_ids" widget="many2many_tags"> <tree> <field name="name"/> <!-- 订单名称 --> <field name="amount_total"/> <!-- 订单金额 --> </tree> </field> </sheet> </form> </field> </record> ``` **效果**:在客户表单中,以列表形式展示该客户所有已完成订单(引用[4])。 #### 4. **数据操作特点** - **数据存储**:One2many字段**不直接存储数据**,实际数据存储在从模型的Many2one字段中(引用[2])。 - **级联删除**:通过`ondelete`参数控制(如`cascade`/`set null`),需在从模型的Many2one字段定义(引用[4])。 - **性能优化**:使用`domain`过滤不必要记录,避免加载大量数据(引用[3])。 #### 5. **与Many2many的区别** | 特性 | One2many | Many2many | |--------------|------------------------------|----------------------------| | **关系类型** | 主从关系(需Many2one支持) | 多对多(双向独立) | | **数据存储** | 存储在从表 | 存储在中间表 | | **反向查询** | 自动通过inverse_name实现 | 需单独定义反向字段 | > 示例:客户→订单是One2many(主→从),而标签→产品是Many2many(双向关联)(引用[2])。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值