Per assicurare l’integrità dei nostri dati Odoo ci fornisce due strumenti principali che possiamo applicare ai nostri modelli: Vincoli SQL e Vincoli Python.
I vincoli SQL sono aggunti direttamente alla definizione della tabella a livello di database e sono controllati quindi direttamente da PostgreSQL. Una volta configurati non sarà quindi possibile creare eccezioni per aggirarli.
Per configurare un vincolo sql si aggiunge un attributo sql_constraints che è un alista di tuple, in ogni tupla viene espresso l’identificatore del vincolo, il codice SQL per il vincolo e il messaggio di errore da usare.
Un classico è quello di aggiungere un vincolo di unicità a un campo, per esempio:
class TodoTask(models.Model):
_sql_constraints = [
('todo_task_unique_name',
'UNIQUE(name)',
'Il titolo del task deve essere unico')
]
Fa si che non sia più possibile aggiungere due task con lo stesso titolo.
I vincoli Python invce possono essere utilizati per fare controlli di qualsiasi tipo utilizzando una funzione specifica. La funzione deve essere dichiarata utilizzando il decoratore @api.constraints indicando la lista di campi che dovranno passare i controlli. La validazione è chiamata ogni volta che si modfificheranno alcuni o tutti i campi dichiarati.
Per esempio
from odoo.exception import ValidationError
# in TodoTask class
@api.constraints('name')
def _check_name_length(self):
for todo in self:
if len(todo.name) < 10:
raise ValidationError('Il titolo del task è troppo corto')
Controlla che il titolo di ogni task sia lungo almeno 10 caratteri.