Odoo 10中如何将用户邮箱设为Joked模型的外键?
解决Odoo模型中用户邮箱存储的问题
首先得明确一个关键点:在Odoo里,Many2one字段的核心作用是关联另一个模型的记录,它在数据库中存储的始终是关联记录的ID,而不是该记录的某个字段值(比如邮箱)。所以你当前的last_accessed_by字段存储用户ID是完全正常的默认行为。
接下来根据你的实际需求,给你两种针对性的解决方案:
需求1:只是想在界面上显示用户邮箱,而非用户ID/名称
这种情况不需要修改模型字段,只需要调整视图配置即可:
- 如果你想保留Many2one的选择功能,但让界面显示邮箱作为字段内容:
在XML视图里这样定义字段:
(前提是你已经在<field name="last_accessed_by" string="Complainant Email" options="{'no_open': True}"/>res.users模型的视图配置中,把邮箱设为该模型的显示名称字段,或者调整了Many2one控件的显示逻辑) - 如果你只想只读显示邮箱,不需要选择用户的功能:
直接在视图里调用关联用户的邮箱字段:<field name="last_accessed_by.email" string="Complainant Email" readonly="True"/>
需求2:需要在Joked模型中单独存储用户邮箱(作为独立数据库字段)
如果确实要把邮箱值存在Joked模型的数据库表里,可以新增一个Char字段,通过两种方式填充:
方案A:默认值自动填充当前用户邮箱
适合不需要后续同步用户邮箱的场景:
last_accessed_by = fields.Many2one('res.users', string='Complainant', default=lambda self: self.env.uid, required=True) # 新增独立的邮箱字段 complainant_email = fields.Char(string='Complainant Email', default=lambda self: self.env.user.email, required=True)
这样创建记录时,会自动把当前登录用户的邮箱存入complainant_email,但注意如果用户之后在res.users里修改了邮箱,这个字段不会自动同步更新。
方案B:计算字段自动同步邮箱
适合需要实时同步用户最新邮箱的场景:
from odoo import models, fields, api class Joked(models.Model): _name = 'joked' _description = 'Joked Model' last_accessed_by = fields.Many2one('res.users', string='Complainant', default=lambda self: self.env.uid, required=True) complainant_email = fields.Char(string='Complainant Email', compute='_compute_complainant_email', store=True) @api.depends('last_accessed_by') def _compute_complainant_email(self): for record in self: record.complainant_email = record.last_accessed_by.email if record.last_accessed_by else False
这里store=True会把计算出的邮箱值存在数据库中,方便后续查询;当last_accessed_by关联的用户发生变化,或者该用户的邮箱被修改时,这个字段会自动更新为最新值。
总结一下:如果是关联用户的业务需求,保留Many2one到res.users是正确的设计;如果要展示或存储邮箱,通过视图调整或新增字段来实现即可。
内容的提问来源于stack exchange,提问作者Mingg Lex
相关产品推荐
相关产品推荐

