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
相关产品推荐
相关产品推荐

