{"id":242,"date":"2025-11-25T09:35:06","date_gmt":"2025-11-25T09:35:06","guid":{"rendered":"https:\/\/sienna-manatee-218967.hostingersite.com\/blogs\/dominios-binarios-2\/"},"modified":"2026-05-01T18:45:58","modified_gmt":"2026-05-01T18:45:58","slug":"dominios-binarios","status":"publish","type":"post","link":"https:\/\/exdoo.mx\/blogs\/dominios-binarios\/","title":{"rendered":"Dominios binarios"},"content":{"rendered":"<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/dominios-binarios-07-svbs6Jenoa3tO1m6-2-scaled-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<p dir=\"auto\" class=\"body\"><em><u>\u00bfQu\u00e9 es un dominio binario?<\/u><\/em><\/p>\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<p style=\"font-size:16px;line-height:1.6;margin:0;color:#fff;opacity:.95;\">\u201cDominio binario\u201d se refiere a la pr\u00e1ctica de utilizar campos de tipo binario para definir dominios din\u00e1micos de otros campos a trav\u00e9s de vistas. Esto puede resultar confuso porque normalmente los dominios se expresan como listas Python o expresiones tipo Odoo, pero en este caso se almacenan como un campo tipo binario porque almacenan objetos Python serializados.<\/p>\n<\/div>\n<p dir=\"auto\" class=\"body\"><em><u>\u00bfPor qu\u00e9 un dominio puede almacenarse en un campo tipo binario?<\/u><\/em><\/p>\n<p dir=\"auto\" class=\"body\">Odoo permite que el atributo domain de una vista (XML) se pueda cargar desde un campo del modelo, en lugar de ser est\u00e1tico en el XML. Ese campo debe contener una estructura Python serializable, usualmente una lista de tuplas como:<\/p>\n<p dir=\"auto\" class=\"body\">[(&#8216;campo&#8217;, &#8216;operador&#8217;, valor), (&#8216;otro_campo&#8217;, &#8216;in&#8217;, lista_valores)]<\/p>\n<p dir=\"auto\" class=\"body\">Para representarlo en la base de datos, Odoo lo serializa usando pickle\/base64 en un <em>fields.Binary,<\/em> porque:<\/p>\n<ul style=\"padding-left:22px;line-height:1.9;\">\n<li>\n<p dir=\"auto\" class=\"body\">El dominio debe poder almacenar listas, tuplas, booleanos, n\u00fameros o None.<\/p>\n<\/li>\n<li>\n<p dir=\"auto\" class=\"body\">Un campo tipo Char o Text no soportar\u00eda bien objetos complejos o valores nativos.<\/p>\n<\/li>\n<li>\n<p dir=\"auto\" class=\"body\">Se quiere evitar transformaci\u00f3n manual a JSON o eval.<\/p>\n<p dir=\"auto\" class=\"body\">\n<\/li>\n<\/ul>\n<p dir=\"auto\" class=\"body\">Por eso, Odoo serializa el objeto Python en binario y lo guarda en fields.Binary.<\/p>\n<p dir=\"auto\" class=\"body\">Luego, la vista simplemente lee el contenido y lo interpreta como dominio.<\/p>\n<p class=\"body\" dir=\"auto\"><em><u>Ejemplos de dominios binarios dentro de Odoo<\/u><\/em><\/p>\n<p class=\"body\" dir=\"auto\">El m\u00f3dulo account (Contabilidad) agrega el siguiente campo:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/captura-de-pantalla-2025-11-25-a-la-s-9.50.28a-a.m.-NXeSfN9lT1lTKj7m-2.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<p dir=\"auto\" class=\"body\">Cuyo valor calculado dentro de su funci\u00f3n es el siguiente:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/captura-de-pantalla-2025-11-25-a-la-s-9.53.35a-a.m.-CzJIH1UkZ8tHOVVK-2.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<p class=\"body\" dir=\"auto\">Y este campo se utiliza como dominio del campo \u201c<strong><em>tag_ids<\/em><\/strong>\u201d desde la vista:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/captura-de-pantalla-2025-11-25-a-la-s-9.56.54a-a.m.-RcUt36Uvp8tcpBwl-2.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<p class=\"body\" dir=\"auto\">Aqu\u00ed Odoo detecta que domain no es una expresi\u00f3n literal, sino el nombre de un campo en el modelo. Entonces el cliente web hace lo siguiente:<\/p>\n<ol style=\"padding-left:22px;line-height:1.9;\">\n<li>\n<p class=\"body\" dir=\"auto\">Obtiene el valor del campo tag_ids_domain<\/p>\n<\/li>\n<li>\n<p class=\"body\" dir=\"auto\">Lo deserializa desde binario.<\/p>\n<\/li>\n<li>\n<p class=\"body\" dir=\"auto\">Lo interpreta como un dominio.<\/p>\n<\/li>\n<li>\n<p class=\"body\" dir=\"auto\">Aplica dicho dominio din\u00e1mico al campo tag_ids.<\/p>\n<\/li>\n<\/ol>\n<p dir=\"auto\" class=\"body\"><strong>Ejemplo de dominio binario<\/strong><\/p>\n<p dir=\"auto\" class=\"body\">Supongamos que agregamos el campo <strong><em>test_partner_id<\/em><\/strong> en las cotizaciones donde seleccionamos un cliente (res.partner). Sin tener ninguna restricci\u00f3n sobre su dominio, el campo se visualiza de la siguiente manera:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/captura-de-pantalla-2025-11-25-a-la-s-10.02.23a-a.m.-Co8FT1e4PUlBjN8G-2.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<p dir=\"auto\" class=\"body\">Cuyo c\u00f3digo tiene la siguiente estructura:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/captura-de-pantalla-2025-11-25-a-la-s-10.04.42a-a.m.-gi0miYlpyteGTV9F-2.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;\" \/><br \/>\n<img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/captura-de-pantalla-2025-11-25-a-la-s-10.04.52a-a.m.-btLTp7zqykpleBGq-2.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<p dir=\"auto\" class=\"body\">Dentro del archivo Python anterior, agregamos el campo <strong><em>test_partner_domain<\/em><\/strong>, tipo binario y computado.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/captura-de-pantalla-2025-11-25-a-la-s-10.10.49a-a.m.-0xYDlLCL9ZuZxig8-2.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<p dir=\"auto\" class=\"body\">Dentro de nuestra base con datos demo tenemos el cliente \u201cAzure Interior\u201d de tipo empresa, cuyo id es 15, donde otros clientes est\u00e1n asociados a esta empresa (relaci\u00f3n que se establece dentro del campo <strong><em>parent_id<\/em><\/strong>).<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/captura-de-pantalla-2025-11-25-a-la-s-10.15.23a-a.m.-C9SYo3Da3AN0aIyH-2.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<p dir=\"auto\" class=\"body\">Supongamos que queremos que el dominio sean todos los clientes que est\u00e1n asociados a esta empresa. Entonces, dentro de la definici\u00f3n de la funci\u00f3n del campo computado anterior, hacemos lo siguiente:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/captura-de-pantalla-2025-11-25-a-la-s-10.17.35a-a.m.-m9y9lo8FDxo07XJb-2.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<p dir=\"auto\" class=\"body\">Ahora que definimos nuestro dominio binario, agregamos este mismo campo dentro del atributo domain del campo <strong><em>test_partner_id<\/em><\/strong> que agregamos dentro de las cotizaciones. Agregamos el atributo desde vista de la siguiente manera:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/captura-de-pantalla-2025-11-25-a-la-s-10.22.39a-a.m.-to5pzRDklpxjseHp-2.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<p dir=\"auto\" class=\"body\">Notemos c\u00f3mo agregamos el campo dominio (<strong><em>test_partner_domain<\/em><\/strong>) antes de utilizarlo dentro del atributo domain del campo \u201cCliente (prueba)\u201d (<strong><em>test_partner_id<\/em><\/strong>) que agregamos dentro de las cotizaciones, esto ya que es requerimiento de Odoo agregar desde vista un campo antes de utilizarlo dentro de los atributos de otro campo. Al actualizar nuestro m\u00f3dulo observamos lo siguiente:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/captura-de-pantalla-2025-11-25-a-la-s-10.26.01a-a.m.-BUHaSPIvlV3BM5FI-2.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<p class=\"body\" dir=\"auto\">De esta forma agregamos el dominio a nuestro campo \u201cCliente (prueba)\u201d utilizando un campo binario computado. Solo podemos seleccionar uno de los 3 clientes asociados a la empresa \u201cAzure Interior\u201d, cuyo id es 15.<\/p>\n<p class=\"body\" dir=\"auto\">Hagamos algo m\u00e1s interesante. Supongamos que ahora queremos todos los clientes que est\u00e9n asociados a una empresa, pero que esta empresa tenga al menos 2 ventas relacionadas. En este \u00faltimo punto es donde radica la complejidad del dominio, ya que para obtener las ventas relacionadas a un cliente se necesita el campo \u201cN\u00famero de \u00f3rdenes de venta\u201d (<strong><em>sale_order_count<\/em><\/strong>), el cual est\u00e1 dentro del modelo de clientes (res.partner) y es computado, pero no almacenado. La definici\u00f3n de nuestra funci\u00f3n cambia de la siguiente manera:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/captura-de-pantalla-2025-11-25-a-la-s-10.31.54a-a.m.-IZkKtYbz40LjPSwb-2.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<p class=\"body\" dir=\"auto\">Por lo que al actualizar el m\u00f3dulo y volviendo a revisar nuestro campo que agregamos en cotizaciones, observamos lo siguiente:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/captura-de-pantalla-2025-11-25-a-la-s-10.35.40a-a.m.-1XVMe7kUKIy7uVO8-2.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;\" \/><br \/>\n<img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/captura-de-pantalla-2025-11-25-a-la-s-10.39.33a-a.m.-aQI3OS2lJwGrnOyQ-2.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<p dir=\"auto\" class=\"body\">Notamos como solo nos muestra clientes asociados a las empresas \u201cDeco Addict\u201d, \u201cGemini Furniture\u201d y \u201cReady Mat\u201d. Verificando estos clientes dentro del sistema notamos que, en efecto, con clientes de tipo \u2018Empresa\u2019 que tienen al menos 2 ventas asociadas.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/captura-de-pantalla-2025-11-25-a-la-s-10.43.07a-a.m.-ILsn6EmY0g7CGEia-2.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;\" \/><br \/>\n<img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/captura-de-pantalla-2025-11-25-a-la-s-10.44.52a-a.m.-VtqzpYqNIK83JDji-2.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;\" \/><br \/>\n<img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/captura-de-pantalla-2025-11-25-a-la-s-10.45.05a-a.m.-TIXnXuPaXrbUIb5V-2.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<p dir=\"auto\" class=\"body\">Por lo que se cumplieron las restricciones de nuestro dominio al agregarlas dentro de un campo binario computado.<\/p>\n<p dir=\"auto\" class=\"body\"><strong>Consejos r\u00e1pidos: <\/strong><\/p>\n<ul style=\"padding-left:22px;line-height:1.9;\">\n<li>\n<p dir=\"auto\" class=\"body\">Aunque el campo sea Binary, Odoo lo maneja autom\u00e1ticamente; no debes convertirlo ni codificarlo manualmente. Simplemente asignas una lista\/tupla Python y Odoo se encarga del resto.<\/p>\n<\/li>\n<li>\n<p dir=\"auto\" class=\"body\">Utiliza estos campos para crear dominios din\u00e1micos complejos, por ejemplo, los que dependen de condiciones basadas en campos computados no almacenados.<\/p>\n<\/li>\n<li>\n<p dir=\"auto\" class=\"body\">La gran mayor\u00eda de las veces no necesitar\u00e1s de un dominio binario si las condiciones se basan en campos que se almacenan dentro de la base de datos.<\/p>\n<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>\u00bfQu\u00e9 es un dominio binario? \ud83d\udcd8 ART\u00cdCULO T\u00c9CNICO \u201cDominio binario\u201d se refiere a la pr\u00e1ctica de utilizar campos de tipo binario para definir dominios din\u00e1micos de otros campos\u2026<\/p>\n","protected":false},"author":1,"featured_media":223,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10],"tags":[],"class_list":["post-242","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/posts\/242","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\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/comments?post=242"}],"version-history":[{"count":2,"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/posts\/242\/revisions"}],"predecessor-version":[{"id":1810,"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/posts\/242\/revisions\/1810"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/media\/223"}],"wp:attachment":[{"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/media?parent=242"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/categories?post=242"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/tags?post=242"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}