2012-11-07 9 views
13

Ich habe eine Tabelle in OpenERP/PostgreSQL mit den folgenden Spalten: name und description.OpenERP Unique Constraint

Ich habe die folgende Validierung für eindeutige Namen:

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

Es funktioniert gut, aber es ist Groß- und Kleinschreibung. Derzeit nimmt sie Werte wie „Mickey“, „MICKEY“ und „Mickey“:

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

Gibt es eine Möglichkeit, den Validierungscode zu überarbeiten, so dass es nicht Benutzern erlauben, mehrere Werte wie „Mickey hinzufügen "," MICKEY "und" mickey "? Wie kann ich die eindeutige Schlüsselüberprüfung unempfindlich machen?

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

Antwort

14

Für case insensitive constraints Check-out HERE sonst kann man immer OPENERP Constraints anstelle von SQL.

für OpenERP Constraints

Prüfung Das Beispiel

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

Hallo Ruchir! Danke für die schnelle Antwort. Können Sie mir ein Beispiel geben, wie ich mit OpenERP Constraints die gewünschte Validierung implementieren kann? – codemickeycode

+0

Alle Daten für spezifisches Feld in einer Liste auflisten. Konvertieren Sie es entweder in Klein- oder Großschreibung, dann prüfen Sie den neuen Wert mit dem Operator in und geben Sie das Gegenteil von result ein. –

+0

Es hat funktioniert. Danke Ruchir! Ich habe gerade die Liste geändert, um den letzten Eintrag auszuschließen – codemickeycode

-1

Constraints in Odoo 8,0 oder darüber in einer einfacheren Art und Weise verwendet wird. Alle Datensätze des Modells abrufen und den gewünschten Feldwert mit lower() überprüfen und die Selbstaufzeichnung ausschließen.

@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

Antworten sollten enthalten eine Beschreibung dessen, welcher Code nicht nur ein Codeblock ist. Antworten auf Fragen, die mehr als ein Jahr alt sind, insbesondere auf andere Antworten, sollten Gründe enthalten, warum diese Antwort aufgrund von Sprachänderungen oder Unterschieden zwischen den anderen geposteten Antworten relevant ist. –

Verwandte Themen