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

Openerp 在插入数据odoo 9之前检查计数,openerp,odoo-9,Openerp,Odoo 9,在自定义模块ODOO9中,在数据库中插入新记录之前,如何检查记录是否存在 例如: 如果在表project.task中,我们在下面的代码中有名称“PARIS”和日期_截止日期“2017-01-01”,我需要在执行前发出警告 vals={'name':'PARIS','date_deadline':'2017-01-01']} create_new_task=http.request.env['project.task'].create(VAL) 或者在单击“保存”按钮之前,尝试从project.

在自定义模块ODOO9中,在数据库中插入新记录之前,如何检查记录是否存在

例如:

如果在表project.task中,我们在下面的代码中有名称“PARIS”和日期_截止日期“2017-01-01”,我需要在执行前发出警告

vals={'name':'PARIS','date_deadline':'2017-01-01']}
create_new_task=http.request.env['project.task'].create(VAL)
或者在单击“保存”按钮之前,尝试从project.task获取计数,其中name='PARIS'和date='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!'))
在尝试在数据库中插入新记录后,其中日期为2017-02-02,时间为1,收到以下消息:

重复的键值违反了唯一约束“test\u module\u time\u uniq” 详细信息:键(时间)=(1)已存在


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

@api.constraints('name'、'date\u deadline')
def_检查_现有(自身):
#搜索具有这些参数的条目,如果找到:
#引发ValidationError('项已存在')

您可以使用以下内容:

@api.constraints('name'、'date\u deadline')
def_检查_现有(自身):
#搜索具有这些参数的条目,如果找到:
#引发ValidationError('项已存在')

如果要防止重复记录,请使用sql\u约束

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\u module\u time\u uniq” 详细信息:键(时间)=(1)已存在

这个错误是由postgres而不是odoo抛出的。你们都准备好了,对时间有一个唯一的限制,只是你们需要先删除它

注意:谁添加了唯一的约束?是您在哪里测试代码还是其他人?用评论来回答这个问题^^

ALTER TABLE project_task DROP CONSTRAINT test_module_time_uniq;

如果要防止重复记录,请使用sql_约束

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\u module\u time\u uniq” 详细信息:键(时间)=(1)已存在

这个错误是由postgres而不是odoo抛出的。你们都准备好了,对时间有一个唯一的限制,只是你们需要先删除它

注意:谁添加了唯一的约束?是您在哪里测试代码还是其他人?用评论来回答这个问题^^

ALTER TABLE project_task DROP CONSTRAINT test_module_time_uniq;

您已经在时间字段上定义了sql唯一约束(
test\u module\u time\u uniq
)。您只需要删除它,它就可以工作了。您已经在时间字段(
test\u module\u time\u uniq
)上定义了一个sql唯一约束。您只需要删除它,它应该工作。卸载后,再次安装模块,所有工作正常!是的,因为您在odoo中添加了约束,然后删除了代码,但odoo在创建约束后不会删除约束,这就是为什么。请记住,您定义了一些“在odoo中思考”不删除代码但取消设置,例如,如果您执行操作,请不要删除它,而是取消设置值否则,域将窃取那里,但你不路的结果它不是你想要的…卸载后,再次安装模块所有工作正常!是的,因为您在odoo中添加了约束,然后删除了代码,但odoo在创建约束后不会删除约束,这就是为什么。请记住,您定义了一些“在odoo中思考”不删除代码但取消设置,例如,在操作中如果您执行[something]不删除它但取消设置值[],否则域将在那里偷取,但您不会改变结果,这不是您想要的。。。