如何单独比较(域)many2many字段的值?

时间:2019-04-30 03:34:09

标签: python xml odoo

我想通过用户输入的值来比较字段many2many line_mission的值,只是为了检查某个员工是否已经在某个时间间隔内,我尝试了这段代码,但是它不起作用:

我的字段Many2many:

line_mission = fields.Many2many('hr.employee', string='Employés', help="Employee sent on mission", 
                            copy=True, auto_join=True,readonly=True, states={'draft': [('readonly', False)]})

我的功能是检查员工是否在mission_start_datemission_end_date之间:

    @api.multi
    @api.constrains('mission_start_date', 'mission_end_date')
    @api.depends('line_mission.name')
    def _check_date(self):
        for mission in self:    
            employee = self.env['hr.employee'].search_count([('name', '=', self.id)])
            domain = [
                ('mission_start_date', '<=', mission.mission_end_date),
                ('mission_end_date', '>=', mission.mission_start_date),
                ('id', '!=', mission.id),
                ('state', 'not in', ['end_mission']),
            ]
            nmissions = self.search_count(domain)
            if employee in mission.line_mission.name and nmissions:
                raise UserError(_('Vous ne pouvez pas avoir 2 missions qui se chevauchent le même jour!'))

1 个答案:

答案 0 :(得分:2)

您的功能存在一些问题。

  1. 您不需要使用api.depends,因为api.constrains已经在触发该功能。

  2. 您应在line_mission中添加api.constrains,因为如果更改了employee many2many字段,则应检查约束。

  3. 尝试遵守Odoo准则,并将您的many2many字段从line_mission重命名/重构为employee_idsemployee_on_mission_ids

  4. 如果以后需要使用记录(集合),请不要使用search_count。 Meant是foreach循环的第一行。

  5. 在比较中使用记录(设置),例如在您的if中。

@api.multi
@api.constrains('mission_start_date', 'mission_end_date', 'line_mission')
def _check_date(self):
    for mission in self:
        # the following search is really weird
        # do you always find exactly one?
        # do you really want to search on `name` with `ìd`?
        employee = self.env['hr.employee'].search([('name', '=', self.id)])
        domain = [
            ('mission_start_date', '<=', mission.mission_end_date),
            ('mission_end_date', '>=', mission.mission_start_date),
            ('id', '!=', mission.id),
            ('state', 'not in', ['end_mission']),
        ]
        nmissions = self.search_count(domain)
        # check if record is in recordset
        if employee in mission.line_mission and nmissions:
            raise UserError(_('Vous ne pouvez pas avoir 2 missions qui se chevauchent le même jour!'))