Constraints

Si alguna vez te has preguntado cómo prevenir registros duplicados, controlar rangos de valores válidos dentro de campos o agregar reglas complejas de validación dentro de modelos en Odoo, entonces este blog es para ti. Explicaremos cómo funcionan los constraints (restricciones) y sus dos tipos de implementación. Palabras clave: Decoradores, constraints, restricciones Odoo v18 - Odoo Community

Daniel Sánchez

5/16/20254 min read

¿Qué son los constraints?

Por su simple traducción (o también dentro del contexto de Odoo o bases de datos), son restricciones que aseguran la integridad y validez de los datos. Se utilizan para prevenir que una tabla o modelo almacene datos incorrectos, duplicados o inconsistentes.

Usos y ejemplos

Por mencionar algunos:

  • Prevenir que un campo no sea nulo.
    Ejemplo: No permitir confirmar una factura si no se ha establecido un cliente.

  • Garantizar que un valor será único dentro de un modelo o tabla.
    Ejemplo: No permitir registrar a más de un usuario con la misma dirección de correo electrónico.

  • Que ciertos valores cumplan condiciones lógicas.
    Ejemplo: No permitir agregar valores negativos para campos de montos monetarios.

¿Cómo se crean los constraints dentro de Odoo?

Odoo ofrece dos tipos, cada uno con sus diferencias y formas de implementación: Python constraints y SQL constraints.

SQL constraints

SQL constraints se definen mediante el atributo sqlconstraints dentro del modelo. Este atributo recibe una lista de tripletas, donde cada una contiene strings (cadenas de texto) con el siguiente formato: (name, sql_definition, message), donde:

  • name: es el nombre de la restricción dentro de SQL.

  • sql_definition: Es la expresión que define la restricción a nivel de tabla (por ejemplo, CHECK (...) o UNIQUE (...)).

  • message: Es el mensaje de error que se mostrará si se viola la restricción.

Tomemos el siguiente ejemplo de un SQL constraint dentro del modelo ir.cron (Acciones planificadas):

El atributo sqlconstraints es una lista con una única tripleta. Se define su nombre y su mensaje de error, pero enfoquémonos en el atributo sql_definition, que es una restricción de integridad (CHECK) que impone una regla lógica sobre el campo interval_number (Ejecutar cada), indicando que su valor debe ser mayor a 0. Por lo tanto, si en una acción planificada establecemos un valor negativo, nos genera el error de validación:

Python constraints

Los SQL constraints son una forma eficiente de garantizar la consistencia de los datos. Sin embargo, puede ser necesario realizar comprobaciones más complejas que requieren código escrito en Python.
Los constraints en Python se definen como un decorador con la estructura @constrains(), y se invoca sobre un conjunto de registros. El decorador especifica qué campos están involucrados en la restricción, y esta se evalúa automáticamente cuando cualquiera de estos campos se modifica. Se espera que el método ejecute una excepción si no se cumple la condición que define la validez del dato.

Tomemos el siguiente ejemplo de un python constraint dentro del modelo res.company:

Cuando cambia el campo ‘active’ (Activo) dentro de la compañía, verifica si existen usuarios activos con esa compañía. Si existe por lo menos un usuario, genera el error de validación indicando que no se puede archivar la compañía, indicando el número de usuarios activos. Por lo tanto, si la intentamos archivar en un entorno demo donde el usuario activo utiliza la compañía a archivar, se genera el siguiente error:

Consejos rápidos:

  • Los SQL constraints son más eficientes que los de Python, ya que funcionan a través de consultas SQL. Cuando el rendimiento importa, se deben preferir los SQL constraints.

  • Evita operaciones pesadas dentro de los Python constraints, ya que se ejecutan sobre el conjunto de registros siempre que se actualiza el campo especificado dentro del decorador, además de cuando se crea un nuevo registro dentro del modelo especificado.

  • Siempre proporciona un mensaje de validación al usuario indicando el error de forma clara, ya que los métodos constraints no permiten almacenar los cambios en base de datos si no se corrige el error, lo cual podría alentar la operación del cliente o usuario.

En Exdoo podemos desarrollar cualquier módulo para Odoo en México, implementamos tu ERP con consultores experimentados no solo en Odoo sino en procesos de negocios, tenemos 10 años trabajando solamente con Odoo en México y otros países.