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

Odoo如何遍历One2many字段收集邮箱地址存储到指定计算字段

Odoo One2many字段邮箱批量收集实现方案

核心错误原因

你目前的实现出现两个问题的根本原因:

  1. 计算方法没有遍历每条主记录(res.partner公司记录),单次赋值导致所有记录共用同一个值
  2. 没有为计算字段添加依赖装饰器,计算触发逻辑和取值范围异常

正确实现代码

在res.partner主模型中添加以下计算方法:

from odoo import api, fields, models

class ResPartner(models.Model):
    _inherit = 'res.partner'

    # 你已有的字段定义
    field_contacts_customer_info = fields.One2many(
        'contacts.customer.information', 'another_id', string='Contacts for customer information')
    selected_email = fields.Char(compute='compute_email')

    @api.depends('field_contacts_customer_info.mail_contacts')
    def compute_email(self):
        # 遍历每一条公司记录单独处理
        for partner in self:
            # 批量提取所有关联联系人的邮箱,过滤空值
            all_emails = partner.field_contacts_customer_info.mapped('mail_contacts')
            valid_emails = [email.strip() for email in all_emails if email and email.strip()]
            # 拼接后赋值给当前公司的对应字段
            partner.selected_email = ','.join(valid_emails)

关键逻辑说明

  • 必须添加@api.depends装饰器:指定依赖的关联字段field_contacts_customer_info.mail_contacts,只有当关联的邮箱数据发生变化时才会触发重计算,保证数据准确性
  • 必须遍历self中的所有记录:Odoo计算方法的入参self默认是多条记录的集合,必须单条循环单独赋值,否则会出现所有记录值相同的问题
  • 用mapped方法批量取值:比手动循环关联记录提取字段更简洁高效,Odoo原生方法兼容性更强
  • 增加空值过滤:避免无邮箱的联系人产生冗余空字符串、多余分隔符等问题

可选优化

  • 如果邮箱数量较多,可以把selected_email字段类型替换为fields.Text,避免超出Char字段长度限制
  • 如果需要邮箱去重,可以将valid_emails的赋值逻辑修改为valid_emails = list({email.strip() for email in all_emails if email and email.strip()}),注意set方法会打乱邮箱原有排序,对顺序有要求不要使用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 05:57:02