Odoo如何遍历One2many字段收集邮箱地址存储到指定计算字段
Odoo One2many字段邮箱批量收集实现方案
核心错误原因
你目前的实现出现两个问题的根本原因:
- 计算方法没有遍历每条主记录(
res.partner公司记录),单次赋值导致所有记录共用同一个值 - 没有为计算字段添加依赖装饰器,计算触发逻辑和取值范围异常
正确实现代码
在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
相关产品推荐
相关产品推荐

