在插入数据odoo 9之前检查计数

时间:2017-04-04 13:00:14

标签: openerp odoo-9

如何在自定义模块odoo 9中插入新记录之前,检查记录是否存在?

例如:

如果在表project.task中我们在下面的代码中有名称“PARIS”和date_deadline“2017-01-01”,那么在执行之前我需要警告...

vals = {'name': 'PARIS','date_deadline': '2017-01-01']}
create_new_task = http.request.env['project.task'].create(vals)

或者尝试从project.task获取计数,其中name ='PARIS'和date_deadline ='2017-01-01',然后点击按钮保存!

任何简单的解决方案?

@api.one
@api.constrains('date','time') #Time is Many2one
    def _check_existing(self):
        count = self.env['test.module'].search_count([('date','=',self.date),('time','=',self.time.id)])
        print(self.date)  #2017-01-01
        print(self.time.id) #1
        if(count >= 1):
            raise ValidationError(_('DUPLICATE!'))

尝试在数据库中插入新记录,其中date = 2017-02-02和time = 1获取此消息:

重复键值违反唯一约束“test_module_time_uniq” 细节:键(时间)=(1)已经存在。

时间存在,但日期不同!我需要约束2值!在数据库中,我只有一行,其中date = 2017-01-01,time = 1

2 个答案:

答案 0 :(得分:2)

你可以沿着这些方向使用:

@api.constrains('name', 'date_deadline')
def _check_existing(self):
    # Search for entry with these params, and if found:
        # raise ValidationError('Item already exists')

答案 1 :(得分:2)

如果你想防止重复记录使用sql_constrains

class ModelClass(models.Model):
    _name = 'model.name'
    # your fields ...

    # add unique constraints 
    sql_constraints = [
            ('name_task_uniq', 'UNIQUE (name,date_deadline)',  'all ready got a task with this name and this date')
        ]

    # or use api.constrains if you constrains cannot be don in postgreSQL
    @api.constrains('name', 'date_deadline')
    def _check_existing(self):
        # add you logic to check you constrain  
  

重复键值违反唯一约束“test_module_time_uniq”   细节:键(时间)=(1)已经存在。

这个错误是由postgres抛出的,而不是你已经准备好了一个时间的唯一约束只有你需要先删除它

注意:在您测试代码或其他人的位置时,谁添加了唯一的约束?通过评论^^

回答这个问题
ALTER TABLE project_task DROP CONSTRAINT test_module_time_uniq;