Odoo v10技术问询:如何在单个树形视图中展示两个模型的数据?
嘿,刚接触Odoo的话确实会有点摸不着头脑,别慌,我一步步带你搞定这个需求!根据你的描述,我们需要在树形视图里同时展示自定义submission表和系统自带res_users表的关联数据,核心是匹配两者的用户ID。下面分两种方案,新手优先选第一种,更贴合Odoo的标准用法~
方案一:在submission树形视图中直接关联展示用户信息(推荐)
这种方法最省心,利用Odoo的many2one关联字段直接在现有视图中嵌入用户数据,自动满足submission.user_id = res_users.id的匹配条件。
步骤1:确保submission模型有正确的关联字段
如果你的submission模型之前是用整数字段存用户ID,建议改成标准的many2one关联,这样Odoo会自动处理关联逻辑。打开自定义模块的models/submission.py,修改或添加字段:
from odoo import models, fields class Submission(models.Model): _name = "your.module.submission" # 替换成你实际的submission模型名称 _description = "Submission Record" # 核心:关联res.users模型 user_id = fields.Many2one("res.users", string="关联用户", required=True) # 以下是你的submission原有字段,按需保留 submission_title = fields.Char(string="提交标题") submission_date = fields.Date(string="提交日期") # ...其他自定义字段
如果已经是many2one字段,直接跳过这一步。
步骤2:修改submission的树形视图,添加用户字段
打开模块的views/submission_views.xml,更新树形视图的代码,把res_users的字段通过关联字段引入:
<odoo> <record id="view_submission_tree" model="ir.ui.view"> <field name="name">your.module.submission.tree</field> <field name="model">your.module.submission</field> <field name="arch" type="xml"> <tree string="提交记录(含用户信息)"> <!-- submission表的字段 --> <field name="submission_title"/> <field name="submission_date"/> <!-- 通过user_id关联展示res_users的字段 --> <field name="user_id" string="用户姓名"/> <field name="user_id.login" string="用户登录名"/> <field name="user_id.email" string="用户邮箱"/> <field name="user_id.phone" string="用户电话"/> <!-- 按需添加其他需要展示的用户字段 --> </tree> </field> </record> </odoo>
步骤3:升级模块生效
回到Odoo后台,找到你的自定义模块,点击升级按钮,刷新页面后打开submission的树形视图,就能看到联合展示的数据了!
方案二:创建独立的联合报表视图(适合需要单独展示的场景)
如果需要一个独立的菜单入口来展示联合数据,可以创建一个临时模型(TransientModel)来整合两个表的数据。
步骤1:创建临时报表模型
在models/report.py中添加:
from odoo import models, fields, api class SubmissionUserReport(models.Model): _name = "submission.user.report" _description = "提交记录与用户报表" _transient = True # 临时模型,不存储数据 # 定义需要展示的所有字段 submission_id = fields.Integer(string="提交ID") submission_title = fields.Char(string="提交标题") submission_date = fields.Date(string="提交日期") user_id = fields.Integer(string="用户ID") user_name = fields.Char(string="用户姓名") user_login = fields.Char(string="登录名") user_email = fields.Char(string="邮箱") @api.model def get_report_data(self): # 查询所有关联用户的submission记录 submissions = self.env["your.module.submission"].search([]) report_list = [] for sub in submissions: user = sub.user_id if user: # 过滤掉无关联用户的记录 report_list.append({ "submission_id": sub.id, "submission_title": sub.submission_title, "submission_date": sub.submission_date, "user_id": user.id, "user_name": user.name, "user_login": user.login, "user_email": user.email, }) return report_list
步骤2:创建报表的树形视图和菜单
在views/report_views.xml中添加:
<odoo> <!-- 树形视图 --> <record id="view_submission_user_report_tree" model="ir.ui.view"> <field name="name">submission.user.report.tree</field> <field name="model">submission.user.report</field> <field name="arch" type="xml"> <tree string="提交与用户联合报表"> <field name="submission_id"/> <field name="submission_title"/> <field name="submission_date"/> <field name="user_id"/> <field name="user_name"/> <field name="user_login"/> <field name="user_email"/> </tree> </field> </record> <!-- 动作配置 --> <record id="action_submission_user_report" model="ir.actions.act_window"> <field name="name">提交与用户联合报表</field> <field name="res_model">submission.user.report</field> <field name="view_mode">tree</field> <field name="view_id" ref="view_submission_user_report_tree"/> <field name="target">current</field> </record> <!-- 菜单入口(替换parent为你的模块主菜单ID) --> <menuitem id="menu_submission_user_report" name="提交与用户报表" parent="your.module.main_menu" action="action_submission_user_report"/> </odoo>
步骤3:更新模块配置并升级
在模块的__manifest__.py中添加新的models和views路径,然后升级模块,就能在后台看到新的菜单入口,点击即可查看联合报表。
额外提示
如果你的submission表是用整数字段存储用户ID(而非many2one),可以在模型中添加一个计算字段来关联用户:
user_id_int = fields.Integer(string="用户ID") user_rel = fields.Many2one("res.users", compute="_compute_user_rel", store=True) @api.depends("user_id_int") def _compute_user_rel(self): for rec in self: rec.user_rel = rec.user_id_int
之后在视图中用user_rel.login这样的格式调用用户字段即可。
内容的提问来源于stack exchange,提问作者YamK

