从 Odoo 14 中的数据库检索数据

问题描述

我有一个要满足的要求是从数据库获取一个值并在 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)

My end gol is to been able to fetch in which project the employee is currently assigned.

感谢您的时间!

解决方法

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 的第一种情况与没有限制的第二种情况之间的区别。这是因为用户可以被分配到不同项目中的多个任务。

如果一切正常,请随时告诉我们。