Odoo13:通过控制器为工单记录分配关注者时出现用户匹配错误的问题求助
问题分析与修复:添加工单关注者时匹配到错误用户
根据你的代码和描述,这个问题大概率是用户记录匹配逻辑的漏洞导致的,我帮你梳理了核心原因和对应的修复方案:
核心原因:重复邮箱或记录集处理不当
你的代码里用search([('email', '=', email)])查找用户,但Odoo的search返回的是记录集(可能包含多条匹配记录)。如果系统里有两个用户共用同一个邮箱(比如用户A和B的邮箱重复了),直接取follower.id时,Odoo会默认返回记录集中第一条记录的ID——这就会出现你输入用户A的邮箱,却意外添加了用户B的情况。
另外,你提到用户输入的是“用户A”(用户名),但代码是按邮箱搜索的,这也可能导致匹配错误:如果某个用户的邮箱刚好包含“用户A”的字符串?或者你误将用户名当成邮箱输入,代码匹配到了其他用户?
代码修复方案
我优化了你的代码,解决了记录集处理问题,还增加了用户名匹配的 fallback 逻辑,同时修正了mail.followers创建的一个潜在错误:
if 'followers' in request.params: raw_entries = request.httprequest.form.get('followers').split(',') entries = [entry.strip() for entry in raw_entries] for entry in entries: # 优先按邮箱精确匹配,限制只取1条记录 user = request.env['res.users'].search([('email', '=', entry)], limit=1) if not user: # 如果邮箱匹配不到,尝试按用户名模糊匹配 user = request.env['res.users'].search([('name', 'ilike', entry)], limit=1) if user: # 注意:mail.followers需要的是用户对应的partner_id,不是user_id! follower_vals = { 'res_id': new_ticket.id, 'res_model': 'helpdesk.ticket', 'partner_id': user.partner_id.id } request.env['mail.followers'].create(follower_vals) else: message = f"待处理:将 {entry} 添加到系统并设为该工单的关注者" new_ticket.message_post(body=message)
修复的关键细节:
- 限制搜索结果数量:用
limit=1确保只获取一条匹配记录,避免多条记录时的默认取值错误 - 添加用户名匹配逻辑:针对你提到的用户输入“用户A”(用户名)的场景,增加了模糊匹配用户名的逻辑,提升用户体验
- 修正partner_id参数:原代码直接用
follower.id是错误的——mail.followers的partner_id需要关联的是res.partner的ID,而不是res.users的ID,用户记录的partner_id字段才是正确的关联值
额外排查建议
- 检查重复邮箱:进入Odoo后台,打开
设置 > 用户与公司 > 用户,搜索你测试时用的邮箱,确认是否有多个用户使用同一邮箱 - 验证表单输入:确认表单的
followers字段是否应该收集邮箱还是用户名,如果是用户名,建议将搜索逻辑改为优先按用户名匹配
内容的提问来源于stack exchange,提问作者ITJ
相关产品推荐
相关产品推荐

