问题描述
我有一个要满足的要求是从数据库中获取一个值并在 UI 中显示,我们有一个应用程序,我们可以将“项目”分配给许多人,因此我必须在人员信息中显示一个字段当前分配给他/她的项目。
我正在考虑创建一个函数来使用“search()”方法检索数据以获取所需的字段。
#for the moment i have added the variable in the class
project_name = fields.Char('Project Name',compute='_compute_get_employee_project')
#this is the function i am building (trying)
@api.model
def _compute_get_employee_project(self):
#verify the employee belongs to a project
employee_task = self.env['project.task'].search([('user_id','=',self.user_id.id),('status','assigned')],limit=1)
employee_project = self.env['project.project'].search([('id',employee_task.project_id.id)],limit=1)
感谢您的时间!
解决方法
compute 方法必须将计算值分配给字段。
您可以使用依赖于相关用户的 many2many 字段来计算分配给所选用户的项目。如果只有一个项目分配给所选用户,Odoo 将显示一个项目。
示例:
class ResEmployee(models.Model):
_inherit = 'hr.employee'
project_ids = fields.Many2many('project.project',compute='_get_assigned_projects',string='Projects')
@api.depends('user_id')
def _get_assigned_projects(self):
project_task = self.env['project.task']
for employee in self:
if employee.user_id:
employee.project_ids = [(4,project_id,0) for project_id in
project_task.search(
[('status','=','assigned'),('user_id',employee.user_id.id)]
).mapped('project_id.id')]
else:
employee.project_ids = False
使用以下代码在工作移动字段前显示分配的项目标签:
<record id="view_employee_form" model="ir.ui.view">
<field name="name">hr.employee.form</field>
<field name="model">hr.employee</field>
<field name="inherit_id" ref="hr.view_employee_form"/>
<field name="arch" type="xml">
<field name="mobile_phone" position="before">
<field name="project_ids" widget="many2many_tags"/>
</field>
</field>
</record>
,
您可以执行以下操作:
#for the moment i have added the variable in the class
project_name = fields.Char('Project Name',compute='_compute_get_employee_project')
#this is the function i am building (trying)
@api.multi
@api.depends('user_id')
def _compute_get_employee_project(self):
for emp in self:
#verify the employee belongs to a project
employee_task = self.env['project.task'].search([('user_id',self.user_id.id),('status','assigned')],limit=1)
employee_project = self.env['project.project'].search([('id',employee_task.project_id.id)],limit=1)
emp.project_name = employee_project.display_name
或者你可以走另一条路
project_ids = fields.One2many('project.project',compute='_compute_get_employee_project')
@api.multi
@api.depends('user_id')
def _compute_get_employee_project(self):
for emp in self:
emp_task_ids = self.env['project.task'].search([('user_id',emp.user_id.id),'assigned')])
emp_project_ids = emp_task_ids.mapped('project_id')
emp.write({
'project_ids': [(6,emp_project_ids.ids)]
})
请注意之前的字段定义 Char
和新的 One2many
之间的区别。添加 limit=1
的第一种情况与没有限制的第二种情况之间的区别。这是因为用户可以被分配到不同项目中的多个任务。
如果一切正常,请随时告诉我们。