2016-09-22 30 views
0

我想添加数据库端验证,只允许使用SQL_Constraints或Check约束的基于订单ID的一个类别。关于插入或更新的数据库验证只允许基于订单ID的一个类别

表:order_line_table 实施例允许仅基于订单ID

Id  Order_id Categ_id 
1  1   4 
2  1   4 
3  1   4 
4  2   5 
5  2   5 

实施例不允许基于订单ID

Id Order_id Categ_id 
6   3   4 
7   3   5 

我试图插入或更新不同类别插入或更新相同的类别下面的代码在服务器端工作。但使用Web服务xmlrpc验证不起作用。

@api.one 
@api.constrains('order_line') 
def _check_category(self): 
    list_categ = [] 
    filter_categ = []   
    if self.order_line: 
     order_line_vals = self.order_line 
     for line_vals in order_line_vals: 
      for line in line_vals: 
       categ_id = line.categ_id and line.categ_id.id or False 
       list_categ.append(line.categ_id.id) 
       if isinstance(line, dict): 
        list_categ.append(line['categ_id']) 
     filter_categ = list(set(list_categ))    
     if len(filter_categ) > 1: 
      raise UserError(_('Only one product category is allowed!')) 

回答

1

起初我误解了你的问题,所以我正在更新答案。

要实现你的目标,你可以在PostgreSQL中使用EXCLUDEconstraint

CREATE TABLE order_line_table 
(
    Id SERIAL PRIMARY KEY, 
    Order_id INT, 
    Categ_id INT, 
    EXCLUDE USING GIST 
    (
     Order_id WITH =, 
     Categ_id WITH <> 
    ) 
); 

为了支持GIST指数比<>操作你have to install an additional PostgreSQL扩展btree_gist

CREATE EXTENSION btree_gist; 

演示:

# INSERT INTO order_line_table (Order_id, Categ_id) VALUES (1, 2); 
INSERT 0 1 

# INSERT INTO order_line_table (Order_id, Categ_id) VALUES (1, 2); 
INSERT 0 1 

# INSERT INTO order_line_table (Order_id, Categ_id) VALUES (1, 3); 
ERROR: conflicting key value violates exclusion constraint "orders_order_id_category_id_excl" 
DETAIL: Key (Order_id, Categ_id)=(1, 3) conflicts with existing key (Order_id, Categ_id)=(1, 2). 
+0

它反向工作。实际上,我的要求只允许基于order_id的同一类别。 – user1731940

+0

谢谢在pgadmin方面工作。 – user1731940

相关问题