2012-11-07 14 views
13

Ho una tabella in OpenERP/PostgreSQL con le seguenti colonne: name e description.OpenERP Unique Constraint

ho aggiunto il seguente convalida per nome univoco:

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

Funziona bene ma è case sensitive. Attualmente, accetta valori come "Topolino", "MICKEY" e "mickey":

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

C'è un modo per rivedere il codice di convalida in modo che non permetterà agli utenti di aggiungere diversi valori come "Mickey "," MICKEY "e" mickey "? Come posso rendere insensibile la maiuscola della validazione della chiave univoca?

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

risposta

14

Per case insensitive constraints check out HERE altro si può sempre utilizzare OpenERP Vincoli invece di SQL.

per vincoli OpenERP

controllo nell'esempio

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

Ciao Ruchir! grazie per la pronta risposta Puoi darmi un esempio di come posso implementare la convalida desiderata usando i vincoli OpenERP? – codemickeycode

+0

Elencare tutti i dati per campo specifico in un elenco. Converti in maiuscolo o in maiuscolo, quindi controlla il nuovo valore con l'operatore in e restituisci l'opposto del risultato. –

+0

Ha funzionato. Grazie Ruchir! Ho appena modificato l'elenco per escludere l'ultima voce – codemickeycode

-1

utilizzando vincoli in vudù 8.0 o sopra in modo più semplice. ottiene tutti i record del modello e controlla il valore del campo desiderato con inferiore() ed escluso il record personale.

@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

Le risposte dovrebbero contenere la descrizione di quale codice non è solo un blocco di codice. Le risposte da domande che hanno più di un anno di vita con altre risposte in particolare, dovrebbero includere motivi per spiegare perché questa risposta è pertinente a causa di eventuali cambiamenti nella lingua o differenze tra le altre risposte pubblicate. –