2012-11-07 249 views
13

我在OpenERP/PostgreSQL中有一個表格,列表如下:namedescriptionOpenERP唯一約束

我添加了獨特的名字下面的驗證:

_sql_constraints = [('unique_name', 'unique(name)', 'A record with the same name already exists.')] 

它工作正常,但它是區分大小寫。目前,它接受數值,如「米奇」,「米奇」和「米奇」:

Wrong Way: 
-------------------------- 
| name | description | 
-------------------------- 
| mickey | not a mouse | 
-------------------------- 
| MICKEY | not a mouse | 
-------------------------- 
| Mickey | not a mouse | 
-------------------------- 

有沒有辦法修改的驗證代碼,以便它不會允許用戶添加幾個值,如「米奇「,」MICKEY「和」米奇「?我如何使獨特的密鑰驗證不區分大小寫?

Right Way: 
-------------------------------- 
| name   | description | 
-------------------------------- 
| mickey  | not a mouse | 
-------------------------------- 
| mickey mouse | is a mouse | 
-------------------------------- 
| donald  | is a duck  | 
-------------------------------- 

回答

14

case insensitive constraints退房HERE 否則你可以隨時使用OpenERP的約束,而不是SQL。

爲OpenERP的約束

檢查以更簡單的方式使用約束在Odoo 8.0或以上的例子中

def _check_unique_insesitive(self, cr, uid, ids, context=None): 
    sr_ids = self.search(cr, 1 ,[], context=context) 
    lst = [ 
      x.FIELD.lower() for x in self.browse(cr, uid, sr_ids, context=context) 
      if x.FIELD and x.id not in ids 
      ] 
    for self_obj in self.browse(cr, uid, ids, context=context): 
     if self_obj.FILD and self_obj.FILD.lower() in lst: 
      return False 
    return True 

_constraints = [(_check_unique_insesitive, 'Error: UNIQUE MSG', ['FIELD'])] 
+0

嗨Ruchir!感謝您的及時迴應。你能給我一個例子,說明如何使用OpenERP約束實現所需的驗證? – codemickeycode

+0

列出一個列表中的所有特定數據字段。將其轉換爲低位或大寫,然後使用in運算符檢查New Value,並返回結果的相反值。 –

+0

它的工作。謝謝Ruchir! 我剛剛修改了列表以排除最後一個條目 – codemickeycode

-1

。 獲取模型的所有記錄並用lower()檢查所需的字段值,並排除自記錄。

@api.constrains('code') 
def _check_duplicate_code(self): 
    codes = self.search([]) 
     for c in codes: 
      if self.code.lower() == c.code.lower() and self.id != c.id: 
       raise exceptions.ValidationError("Error: code must be unique") 
+0

答案應該包含什麼代碼不僅僅是一段代碼的描述。對於超過一年的問題以及其他答案尤其是答案,應該包括爲什麼這個答案是相關的原因,因爲語言的任何變化或其他發佈的答案之間的差異。 –