logo del blog

Devproplus

SQL y api constraints en Odoo explicadas con ejemplos

4 min de lectura

En el desarrollo de Odoo, las constraints son fundamentales para asegurar la integridad de los datos y fortalecer la confiabilidad de las aplicaciones. Desde evitar duplicados hasta imponer reglas específicas, estas restricciones o constraints son esenciales para mantener datos coherentes y fiables. En este artículo descubrimos cómo funcionan y como se utilizan en Odoo.

En Odoo existen dos constraints, una de ellas es _sql_constraints y las otra es @api.constrains. Las dos se aplican a nivel de modelo, es decir, en el archivo Python. Las _sql_constraints trabajan a nivel de base de datos y la @api.constrains se aplica a los métodos. _sql_constraints tienen mejor rendimiento que @api.constrains, pero son más limitada en cuanto a la lógica que se requiere aplicar en alguna validaciones, para este último caso, @api.constrains entra a jugar. Veámoslo en detalle

Como funciona _sql_constraints

Las restricciones SQL se definen mediante el atributo del modelo _sql_constraints. A este atributo se le asigna una lista de tuplas que contienen cadenas (nombre, definición_sql, mensaje), donde nombre es un nombre de restricción SQL válido, definición_sql es una expresión SQL que define la restricción y mensaje es el mensaje de error que se muestra cuando se viola la restricción. Veamos la sintaxis.

_sql_constraints = [(name, sql_definition, message)]

name: Es un string que define un nombre de restricción SQL válido.

sql_definition: Es otro string que define una expresión SQL para la restricción.

message: También una cadena de texto que será el mensaje mostrado cuando se cumpla la restricción.

Las constraints válidas para aplicar son las existentes en PostgreSQL y ellas son las siguiente:

A continuación un ejemplo. En el ejemplo utilazaré la constraint CHECK.

_sql_constraints = [('check_price', 'CHECK(price > 0)', 'The price must be greater than zero')]

Como se puede observar en el video demostrativo, la constraint comprueba que el precio sea mayor que cero, entonces, al intentar guardar un registro cuyo precio no sea mayor que cero, se activará la constraint.

Como funciona @api.constrains()

Una restricción o constraint de Python se define como un método decorado con restricciones y se invoca en un conjunto de registros. El decorador especifica qué campos están involucrados en la restricción, es decir, usted puede establecer más de un campo. La restricción se evalúa automáticamente cuando se modifica cualquiera de estos campos. Se espera que el método genere una excepción si no se cumple la lógica establecida. Veamos la sintaxis:

@api.constrains('screen_size')
def check_screen_size(self):
    for record in self:
        if record.screen_size <= 0:
            raise ValidationError('The Screen size must be greater than zero')

Como se puede ver en el código de ejemplo, primeramente hay que definir el decorador @api.constrains y entre los paréntesis se establecen los campos involucrados. Después se define el método con la lógica necesaria. Veamos un ejemplo de como funcióna el código anterior.

Como se puede observar en el video, si se cambia el tamaña de la pantalla a cero y se intenta guardar el registro con ese valor, se activa el método con el decorador @api.constrains. Como se mencionó anteriormente, se puede establecer más de un campo. Veamos otro ejemplo usando dos campos.

Conclusión

En este artículo se ha intentado explicar las constraints existentes en Odoo, las diferencias entre ellas y cuando es más conveniente aplicar una u otra.