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

Odoo中通过Many2One关联获取关联模型字段并在表单视图展示

嘿,我来帮你搞定这两个Odoo的问题!先看你已经定义好的employee模型,已经通过user_id关联了res.users,接下来分两部分给你说明:

一、在Employee表单视图中展示res.users的字段

你可以通过两种常用方式在表单里展示关联的res.users字段,根据你的需求选就行:

方式1:使用related字段(推荐,适合需要单独控制显示/编辑权限的场景)

先在你的Employee模型里添加关联的related字段,比如要展示用户的登录名和邮箱:

class Employee(models.Model):
    _name = "employee"
    emp_name = fields.Char(string='Employee name')
    emp_pnum = fields.Char(string='Phone number')
    user_id = fields.Many2one('res.users', string='User', default=lambda self: self.env.uid, required=True)
    # 添加related字段关联res.users的字段
    user_login = fields.Char(string='User Login', related='user_id.login', readonly=True)
    user_email = fields.Char(string='User Email', related='user_id.email', readonly=True)

然后在表单视图XML里直接添加这些字段:

<form string="Employee">
    <sheet>
        <group>
            <field name="emp_name"/>
            <field name="emp_pnum"/>
            <field name="user_id"/>
            <!-- 展示关联的res.users字段 -->
            <field name="user_login"/>
            <field name="user_email"/>
        </group>
    </sheet>
</form>

方式2:直接在视图中通过关联字段访问(适合只读、快速展示的场景)

不用修改模型,直接在视图里用user_id.字段名的格式展示,省去添加模型字段的步骤:

<form string="Employee">
    <sheet>
        <group>
            <field name="emp_name"/>
            <field name="emp_pnum"/>
            <field name="user_id"/>
            <!-- 直接展示res.users的登录名和邮箱 -->
            <field name="user_id.login" string="User Login" readonly="1"/>
            <field name="user_id.email" string="User Email" readonly="1"/>
        </group>
    </sheet>
</form>

二、通过Many2One关联获取关联模型的字段值

这里你的employee是模型B,关联的res.users是模型A,在Python代码里获取字段值非常直观,分几种场景:

单条记录的情况

如果你拿到了一条employee记录,直接通过user_id点对应字段名就能获取:

# 假设获取id为1的employee记录
employee = self.env['employee'].browse(1)
# 获取关联用户的登录名
login_name = employee.user_id.login
# 获取关联用户的邮箱
email = employee.user_id.email
# 注意:如果user_id可能为空,最好加判断避免报错
if employee.user_id:
    display_name = employee.user_id.display_name

批量记录的情况(遍历记录集)

处理多个employee记录时,同样可以直接访问关联字段,Odoo会自动优化查询(避免N+1性能问题):

# 获取所有employee记录
employees = self.env['employee'].search([])
for emp in employees:
    if emp.user_id:
        print(f"员工{emp.emp_name}关联的用户登录名:{emp.user_id.login}")

在计算字段中使用

如果想给Employee加一个动态计算的字段,展示关联用户的信息,比如全名:

class Employee(models.Model):
    _name = "employee"
    # ... 现有字段 ...
    user_fullname = fields.Char(string='User Fullname', compute='_compute_user_fullname')

    def _compute_user_fullname(self):
        for emp in self:
            # 处理user_id为空的情况
            emp.user_fullname = emp.user_id.name if emp.user_id else ""

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:03:29