{"id":980,"date":"2025-05-16T10:48:28","date_gmt":"2025-05-16T10:48:28","guid":{"rendered":"https:\/\/sienna-manatee-218967.hostingersite.com\/blogs\/constraints\/"},"modified":"2026-05-04T04:03:54","modified_gmt":"2026-05-04T04:03:54","slug":"constraints","status":"publish","type":"post","link":"https:\/\/exdoo.mx\/blogs\/constraints\/","title":{"rendered":"Constraints"},"content":{"rendered":"<div style=\"background:linear-gradient(135deg,#0A7099 0%,#0d8db8 100%);color:#fff;padding:28px 26px;border-radius:16px;margin:0 0 28px;box-shadow:0 4px 16px rgba(10,112,153,.2);\">\n<div style=\"display:inline-block;background:rgba(255,255,255,.18);padding:6px 14px;border-radius:20px;font-size:12px;font-weight:700;letter-spacing:.5px;margin-bottom:12px;color:#fff;\">\ud83d\udcd8 ART\u00cdCULO T\u00c9CNICO<\/div>\n<p style=\"font-size:16px;line-height:1.6;margin:0;color:#fff;opacity:.95;\">Por su simple traducci\u00f3n (o tambi\u00e9n 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.<\/p>\n<\/div>\n<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/constraints-b-AoPWrp3E8vIjzged-1.png\" alt=\"\"  style=\"max-width:100%;height:auto;border-radius:10px;box-shadow:0 2px 8px rgba(0,0,0,0.12);display:block;margin:14px auto;\" \/><\/p>\n<h3 style=\"color:#0A7099;margin-top:24px;\"><span><em><u>\u00bfQu\u00e9 son los constraints?<\/u><\/em><\/span><\/h3>\n<div style=\"background:linear-gradient(135deg,#0A7099 0%,#0d8db8 100%);color:#fff;padding:28px 26px;border-radius:16px;margin:0 0 28px;box-shadow:0 4px 16px rgba(10,112,153,.2);\">\n<div style=\"display:inline-block;background:rgba(255,255,255,.18);padding:6px 14px;border-radius:20px;font-size:12px;font-weight:700;letter-spacing:.5px;margin-bottom:12px;color:#fff;\">\ud83d\udcd8 ART\u00cdCULO T\u00c9CNICO<\/div>\n<\/div>\n<p class=\"body\" dir=\"auto\"><span><em><u>Usos y ejemplos<\/u><\/em><\/span><\/p>\n<p class=\"body\" dir=\"auto\"><span>Por mencionar algunos:<\/span><\/p>\n<ul style=\"padding-left:22px;line-height:1.9;\">Prevenir que un campo no sea nulo.<strong><em>Ejemplo:<\/em><\/strong><em> No permitir confirmar una factura si no se ha establecido un cliente.<\/em>Garantizar que un valor ser\u00e1 \u00fanico dentro de un modelo o tabla. <strong><em>Ejemplo:<\/em><\/strong><em> No permitir registrar a m\u00e1s de un usuario con la misma direcci\u00f3n de correo electr\u00f3nico.<\/em>Que ciertos valores cumplan condiciones l\u00f3gicas. <strong><em>Ejemplo:<\/em><\/strong><em> No permitir agregar valores negativos para campos de montos monetarios.<\/em><\/ul>\n<h3 style=\"color:#0A7099;margin-top:24px;\"><span><em><u>\u00bfC\u00f3mo se crean los constraints dentro de Odoo?<\/u><\/em><\/span><\/h3>\n<p class=\"body\" dir=\"auto\"><span>Odoo ofrece dos tipos, cada uno con sus diferencias y formas de implementaci\u00f3n: <em>Python constraints<\/em> y <em>SQL constraints<\/em>.<\/span><\/p>\n<p class=\"body\" dir=\"auto\"><span><strong>SQL constraints<\/strong><\/span><\/p>\n<p class=\"body\" dir=\"auto\"><span>SQL constraints se definen mediante el atributo <em>sqlconstraints<\/em> dentro del modelo. Este atributo recibe una lista de tripletas, donde cada una contiene <em>strings<\/em> (cadenas de texto) con el siguiente formato: <em>(name, sql_definition, message)<\/em>, donde:<\/span><\/p>\n<ul style=\"padding-left:22px;line-height:1.9;\">\n<li><span><em>name<\/em>: es el nombre de la restricci\u00f3n dentro de SQL.<\/span><\/li>\n<li><span><em>sql_definition<\/em>: Es la expresi\u00f3n que define la restricci\u00f3n a nivel de tabla (por ejemplo, CHECK (&#8230;) o UNIQUE (&#8230;)).<\/span><\/li>\n<li><span>message: Es el mensaje de error que se mostrar\u00e1 si se viola la restricci\u00f3n.<\/span><\/li>\n<\/ul>\n<p class=\"body\" dir=\"auto\"><span>Tomemos el siguiente ejemplo de un SQL constraint dentro del modelo <em>ir.cron<\/em> (Acciones planificadas):<\/span><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/sql_constraint_dentro_del_modelo_ir_cron-AGB2JZpya9s2O9lM-1.jpg\" alt=\"\"  style=\"max-width:100%;height:auto;border-radius:10px;box-shadow:0 2px 8px rgba(0,0,0,0.12);display:block;margin:14px auto;\" \/><\/p>\n<h3 style=\"color:#0A7099;margin-top:24px;\"><span>El atributo <em>sqlconstraints<\/em> es una lista con una \u00fanica tripleta. Se define su nombre y su mensaje de error, pero enfoqu\u00e9monos en el atributo <em>sql_definition<\/em>, que es una restricci\u00f3n de integridad (CHECK) que impone una regla l\u00f3gica sobre el campo <em>interval_number<\/em> (Ejecutar cada), indicando que su valor debe ser mayor a 0. Por lo tanto, si en una acci\u00f3n planificada establecemos un valor negativo, nos genera el error de validaci\u00f3n:<\/span><\/h3>\n<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/sql_definition-dJoZX12eylIWE6Jr-1.jpg\" alt=\"\"  style=\"max-width:100%;height:auto;border-radius:10px;box-shadow:0 2px 8px rgba(0,0,0,0.12);display:block;margin:14px auto;\" \/><br \/>\n<img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/un_valor_negativo__nos_genera_el_error_de_validacioin-mv0W8vKP31czLokX-1.jpg\" alt=\"\"  style=\"max-width:100%;height:auto;border-radius:10px;box-shadow:0 2px 8px rgba(0,0,0,0.12);display:block;margin:14px auto;\" \/><\/p>\n<h3 style=\"color:#0A7099;margin-top:24px;\"><span><strong>Python constraints<\/strong><\/span><\/h3>\n<p class=\"body\" dir=\"auto\">Los SQL constraints son una forma eficiente de garantizar la consistencia de los datos. Sin embargo, puede ser necesario realizar comprobaciones m\u00e1s complejas que requieren c\u00f3digo 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\u00e9 campos est\u00e1n involucrados en la restricci\u00f3n, y esta se eval\u00faa autom\u00e1ticamente cuando cualquiera de estos campos se modifica. Se espera que el m\u00e9todo ejecute una excepci\u00f3n si no se cumple la condici\u00f3n que define la validez del dato.<\/p>\n<p class=\"body\" dir=\"auto\"><span>Tomemos el siguiente ejemplo de un python constraint dentro del modelo <em><a href=\"http:\/\/res.company\" class=\"qbe-widget\" rel=\"noopener noreferrer\" target=\"_blank\">res.com<\/a>pany:<\/em><\/span><\/p>\n<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/un_python_constraint-d951ab29WQhwqer2-1.jpg\" alt=\"\"  style=\"max-width:100%;height:auto;border-radius:10px;box-shadow:0 2px 8px rgba(0,0,0,0.12);display:block;margin:14px auto;\" \/><\/p>\n<h3 style=\"color:#0A7099;margin-top:24px;\"><span>Cuando cambia el campo \u2018active\u2019 (Activo) dentro de la compa\u00f1\u00eda, verifica si existen usuarios activos con esa compa\u00f1\u00eda. Si existe por lo menos un usuario, genera el error de validaci\u00f3n indicando que no se puede archivar la compa\u00f1\u00eda, indicando el n\u00famero de usuarios activos. Por lo tanto, si la intentamos archivar en un entorno demo donde el usuario activo utiliza la compa\u00f1\u00eda a archivar, se genera el siguiente error:<\/span><\/h3>\n<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/error_al_intentar_archivar-mp8Wrry17ZCeRP3z-1.jpg\" alt=\"\"  style=\"max-width:100%;height:auto;border-radius:10px;box-shadow:0 2px 8px rgba(0,0,0,0.12);display:block;margin:14px auto;\" \/><br \/>\n<img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/aviso_de_error-A3Q2MXojjWTxjzkq-1.jpg\" alt=\"\"  style=\"max-width:100%;height:auto;border-radius:10px;box-shadow:0 2px 8px rgba(0,0,0,0.12);display:block;margin:14px auto;\" \/><\/p>\n<h3 style=\"color:#0A7099;margin-top:24px;\"><span><strong>Consejos r\u00e1pidos:<\/strong><\/span><\/h3>\n<ul style=\"padding-left:22px;line-height:1.9;\">\n<li><span>Los SQL constraints son m\u00e1s eficientes que los de Python, ya que funcionan a trav\u00e9s de consultas SQL. Cuando el rendimiento importa, se deben preferir los SQL constraints.<\/span><\/li>\n<li><span>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\u00e1s de cuando se crea un nuevo registro dentro del modelo especificado.<\/span><\/li>\n<li><span>Siempre proporciona un mensaje de validaci\u00f3n al usuario indicando el error de forma clara, ya que los m\u00e9todos constraints no permiten almacenar los cambios en base de datos si no se corrige el error, lo cual podr\u00eda alentar la operaci\u00f3n del cliente o usuario.<\/span><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>\ud83d\udcd8 ART\u00cdCULO T\u00c9CNICO Por su simple traducci\u00f3n (o tambi\u00e9n dentro del contexto de Odoo o bases de datos), son restricciones que aseguran la integridad y validez de los\u2026<\/p>\n","protected":false},"author":4,"featured_media":972,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[14],"tags":[],"class_list":["post-980","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development"],"_links":{"self":[{"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/posts\/980","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/comments?post=980"}],"version-history":[{"count":3,"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/posts\/980\/revisions"}],"predecessor-version":[{"id":2000,"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/posts\/980\/revisions\/2000"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/media\/972"}],"wp:attachment":[{"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/media?parent=980"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/categories?post=980"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/tags?post=980"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}