Introducción
El campo Float es uno de los tipos de campo más utilizados en Odoo cuando tus datos implican números decimales. Los precios unitarios, los pesos de los productos, los porcentajes de descuento, las tasas impositivas, los factores de conversión en las listas de materiales: todos estos se almacenan típicamente como campos Float en el modelo de datos de Odoo.
A primera vista, parece una entrada numérica simple. Pero hay varias cosas que vale la pena saber sobre cómo maneja la precisión, cómo se comporta en informes y agregaciones, y cuándo deberías usar un tipo de campo diferente.
Esta guía cubre lo que almacena el campo Float, cómo se comporta en el marco de Odoo, cómo crearlo y personalizarlo utilizando Odoo Studio o Python, y casos de uso empresarial reales en Ventas, Inventario y Contabilidad.
¿Qué es el campo Float en Odoo?
En el ORM de Odoo, el campo Float almacena números decimales. Se mapea a una columna de doble precisión en PostgreSQL, que proporciona hasta 15 dígitos significativos de precisión. Para la mayoría de los casos de uso empresarial, eso es mucho más de lo que necesitas.
Desde la perspectiva del usuario, un campo Float aparece como una entrada numérica en las vistas de formulario. El número de decimales mostrados está controlado por el parámetro digits que defines en el campo. En las vistas de lista, los valores Float se muestran con la misma precisión y están alineados a la derecha por defecto. En tablas dinámicas y gráficos, los campos Float participan en agregaciones como suma, promedio o máximo.
Así es como se ve en una definición de modelo de Python:
from odoo import fields, models
class SaleOrderLine(models.Model):
_inherit = 'sale.order.line'
custom_margin = fields.Float(
string='Margen Personalizado',
digits=(5, 2),
default=0.0,
)
El parámetro digits es una tupla. El primer número es el total de dígitos significativos, el segundo es el número de decimales. Así que (5, 2) permite hasta cinco dígitos significativos con dos decimales.
También puedes hacer referencia a un grupo de precisión nombrado en lugar de codificar los dígitos:
price_premium = fields.Float(
string='Prima de Precio',
digits='Precio del Producto',
)
Odoo tiene varios grupos de precisión incorporados gestionados bajo Configuración > Técnico > Estructura de Base de Datos > Precisión Decimal. Los principales incluyen Precio del Producto, Unidad de Medida del Producto, Descuento y Peso del Stock. Usar grupos de precisión significa que los usuarios pueden ajustar la precisión decimal desde la interfaz sin necesidad de cambiar el código.
En Odoo Studio, el campo Float se etiqueta como Número Decimal. Cuando se crea a través de Studio, utiliza la precisión predeterminada a menos que lo configures de otra manera en el panel de propiedades del campo. Esto lo convierte en uno de los campos más accesibles de Odoo Studio para los usuarios de negocios que necesitan extender formularios sin soporte de desarrolladores.
Cómo funciona el campo
Cuando defines un campo Float en Odoo, el marco maneja automáticamente la creación de la columna en la base de datos durante la instalación o actualización del módulo. No se necesitan scripts SQL manuales ni de migración.
El parámetro digits controla dos cosas a la vez: cómo se muestran los valores en la interfaz y cómo se redondean antes de ser almacenados. Si defines digits=(6, 2) y un usuario ingresa 3.14159, Odoo redondea y almacena 3.14. Este redondeo ocurre a nivel de ORM, no solo en la capa de visualización.
Atributos Clave del Campo
Estas son las propiedades más importantes que puedes configurar en un campo Float en el marco de Odoo:
- digits: Una tupla como
(6, 2)o una cadena de grupo de precisión nombrada. Controla tanto la precisión de visualización como la de almacenamiento. - required: Hace que el campo sea obligatorio. Un campo Float con un valor de
0.0pasará la verificación requerida, lo que puede no ser siempre el comportamiento deseado. - default: Valor predeterminado cuando se crea un nuevo registro. Establecer
default=0.0asegura que el campo siempre tenga un valor numérico en lugar deFalse. - compute: Vincula un método de Python que calcula dinámicamente el valor del campo. Útil para valores derivados como márgenes o resultados de conversión en campos computados de odoo.
- store: Cuando se usa con
compute, guarda el valor calculado en la base de datos para que pueda ser buscado, filtrado y agrupado. - group_operator: Controla cómo se agrega el campo en vistas de pivote y gráfico. Los valores comunes son
'sum','avg','min'y'max'. Los campos Float por defecto son'sum'. - copy: Controla si el valor se copia al duplicar un registro. Por defecto es
True.
Cómo Aparece en las Vistas
En las vistas de formulario, un campo Float se representa como una entrada numérica. La visualización respeta la configuración regional del usuario para los separadores decimales. En las vistas de lista, los valores Float están alineados a la derecha por defecto. En las vistas de búsqueda, puedes filtrar por valores Float utilizando operadores de comparación numérica.
Puedes aplicar widgets a los campos Float en las vistas. El widget percentage, por ejemplo, multiplica el valor almacenado por 100 para la visualización y añade un signo de porcentaje, lo que es útil para campos que almacenan valores en el rango de 0-1. Este es un patrón común en el desarrollo de Odoo al trabajar con tasas y factores.
Interacción con el ORM de Odoo
Leer un campo Float te da un float de Python, o False si el campo no ha sido establecido y no se ha definido un valor predeterminado. Escribir en un campo Float acepta enteros, floats o False. El ORM aplica la precisión de digits en el momento de guardar.
Una nota importante para el desarrollo de Odoo: no compares valores Float con == en Python. Debido a cómo funciona la aritmética de punto flotante a nivel de hardware, los valores que parecen iguales pueden no serlo. Utiliza float_compare y float_is_zero de odoo.tools.float_utils en su lugar, que respetan la precisión del campo definida en tu modelo de datos de Odoo.
Casos de uso empresarial
El campo Float aparece en casi todos los módulos de una implementación de Odoo. Aquí hay cinco ejemplos prácticos de flujos de trabajo empresariales reales.
Ventas: Porcentajes de Descuento en Líneas de Pedido
El campo nativo discount en sale.order.line es un campo Float. Cuando un representante de ventas aplica un descuento del 15%, Odoo almacena 15.0 y lo aplica al cálculo del precio unitario. Este valor fluye a través de las cotizaciones impresas y las facturas de los clientes, y participa en los informes de márgenes. Obtener los descuentos correctos es importante tanto para la comunicación con el cliente como para el análisis de la rentabilidad del negocio.
Inventario: Pesos y Volúmenes de Productos
Los productos en Odoo tienen campos nativos de weight y volume, ambos Floats. Un producto que pesa 2.5 kg o ocupa 0.003 m3 necesita una precisión decimal que un campo Integer simplemente no puede proporcionar. Estos valores se utilizan directamente en los cálculos de costos de envío y en las integraciones con transportistas. Si estás utilizando Odoo con un conector de entrega, los valores Float precisos en peso y volumen determinan la tarifa de envío devuelta por la API del transportista.
Contabilidad: Tasas Impositivas
Las tasas impositivas en account.tax son campos Float. Un IVA estándar del 21% se almacena como 21.0, una tasa reducida podría ser 6.0 o 5.5. El motor de contabilidad de Odoo lee estos valores para calcular los montos de impuestos en cada factura y factura de proveedor. La precisión es importante aquí porque pequeñas diferencias de redondeo pueden acumularse a lo largo de cientos de transacciones y causar discrepancias en los informes fiscales.
Manufactura: Cantidades de la Lista de Materiales
En la Manufactura de Odoo, la cantidad de cada componente en una lista de materiales es un campo Float. Una receta podría requerir 0.75 litros de un ingrediente líquido o 2.5 kg de una materia prima. Los campos Float manejan estas cantidades fraccionarias de forma natural. Usar un campo Integer en este contexto obligaría a redondear e introducir errores de producción que se acumulan con el tiempo.
Compra: Factores de Precio y Márgenes de Proveedores
Al configurar listas de precios de proveedores o reglas de margen, los campos Float almacenan los multiplicadores y márgenes. Un factor de margen de 1.25 (25% de recargo) o un factor de descuento de 0.85 (15% de descuento sobre el precio de lista) son valores típicos en la lógica de precios de compra. Estos valores Float se utilizan en cálculos automáticos de precios en órdenes de compra y ayudan a los equipos de compras a mantener precios consistentes entre proveedores.
Creación o personalización del campo Float
Hay tres formas principales de añadir un campo Float a un modelo de Odoo, dependiendo de tu contexto técnico y enfoque de implementación.
Usando Odoo Studio (Sin Código)
Odoo Studio es la herramienta de personalización de bajo código integrada. Para añadir un campo Float sin escribir ningún código:
- Abre Odoo Studio desde el menú principal.
- Navega hasta el formulario donde quieres el campo.
- Arrastra un campo Número Decimal desde el selector de campos al formulario.
- Configura la etiqueta, el valor predeterminado y el número de decimales en el panel de propiedades.
- Guarda y cierra Studio.
Studio crea el campo con un prefijo x_studio_ y lo añade automáticamente a la vista del formulario. No se necesita trabajo en la base de datos de tu parte. Esta es una de las formas más accesibles de crear campos en Odoo para los usuarios que desean personalización de Odoo sin complejidad técnica.
Usando Python en un Módulo Personalizado
Para los desarrolladores que construyen módulos de Odoo, los campos Float se definen directamente en Python. Este es el enfoque recomendado para cualquier desarrollo en Odoo que necesite ser controlado por versiones y desplegado en múltiples entornos:
from odoo import fields, models
class ResPartner(models.Model):
_inherit = 'res.partner'
x_credit_limit = fields.Float(
string='Límite de Crédito',
digits=(12, 2),
default=0.0,
help='Saldo máximo pendiente permitido para este cliente.',
)
Después de agregar el campo al modelo, inclúyelo en el XML de vista relevante para que aparezca en la interfaz. Odoo maneja automáticamente la columna de la base de datos al instalar o actualizar el módulo. Este es el enfoque estándar de la guía del desarrollador de Odoo para cualquier trabajo serio de personalización de Odoo.
Usando la API XML-RPC
Si estás gestionando personalizaciones de Odoo programáticamente, por ejemplo, a través de un script de implementación o un cuaderno de configuración remota, puedes crear campos Float a través de la API XML-RPC:
field_id = models.execute_kw(
ODOO_DB, uid, ODOO_API_KEY,
'ir.model.fields', 'create',
[{
'name': 'x_custom_coefficient',
'field_description': 'Coeficiente Personalizado',
'model_id': model_id,
'ttype': 'float',
'state': 'manual',
}]
)
El valor state: manual le indica a Odoo que este campo fue creado manualmente en lugar de por un módulo, que es la configuración correcta para los campos creados a través de Studio o la API. La precisión decimal para los campos Float creados por la API se gestiona a través de la configuración de Precisión Decimal en el menú técnico. Este es el enfoque que utiliza Dasolo para la creación remota de campos como parte de scripts de configuración automatizada de Odoo.
Mejores prácticas
1. Usa grupos de precisión nombrados para valores estándar
En lugar de codificar digits=(6, 2), referencia un grupo de precisión como 'Precio del Producto' o 'Unidad de Medida del Producto'. Esto permite a los usuarios con acceso técnico ajustar la precisión desde la interfaz sin cambios en el código, y alinea tus campos personalizados con la misma precisión que los campos nativos de Odoo en el mismo contexto.
2. Usa Monetario para montos en moneda, no Float
Este es el punto más importante de esta lista. El campo Monetario está diseñado específicamente para montos que tienen una moneda. Se vincula a un campo de moneda en el mismo modelo, maneja el redondeo según las reglas de la moneda y funciona correctamente en entornos de múltiples monedas. Usar un campo Float para montos de facturas o precios de venta causará inconsistencias de redondeo y romperá los informes de múltiples monedas.
3. Siempre establece un valor predeterminado
Establece default=0.0 para campos numéricos que deberían comenzar en cero. Sin un valor predeterminado, el valor del campo es False (nulo en la base de datos) hasta que el usuario lo complete. Esto puede causar errores inesperados en campos computados o métodos de Python que asumen que un valor numérico siempre está presente.
4. Establece group_operator para informes
Si un campo Float representa una cantidad o monto que tiene sentido sumar en informes, añade group_operator='sum'. Si representa una tasa o un porcentaje donde promediar tiene más sentido, utiliza group_operator='avg'. Hacer esto correctamente asegura que las tablas dinámicas y las vistas gráficas agreguen tus datos de manera significativa, lo cual es muy importante en los campos de la base de datos de Odoo utilizados para análisis.
5. Documenta tus convenciones de porcentaje
Si un campo Float almacena un porcentaje, sé explícito sobre si utiliza un rango de 0-100 (como el campo nativo discount: 15.0 para 15%) o un rango de 0-1 (como algunos campos de margen: 0.15 para 15%). Mezclar estas convenciones a través de un modelo de datos produce errores de cálculo silenciosos que son muy difíciles de rastrear después.
Errores comunes
Uso de Float para montos monetarios
Los campos Float no llevan información de moneda. Un campo Float que muestra 1500 podría ser euros, dólares o cualquier otra cosa. En una configuración de Odoo multi-moneda, esto lleva a totales incorrectos en los informes financieros. Utiliza el tipo de campo Monetary para cualquier monto que tenga una moneda.
No establecer el parámetro digits
Sin digits explícito, Odoo aplica una precisión Float predeterminada de 2 decimales. Esto está bien para precios, pero no para campos que necesitan 4 o 6 decimales, como tasas de cambio o factores de conversión de unidades. Un factor de conversión redondeado silenciosamente a 2 decimales producirá errores acumulativos en cada transacción que lo utilice.
Comparando valores Float con == en Python
Debido a cómo funcionan los números de punto flotante a nivel de hardware, dos valores Float que parecen idénticos pueden no ser iguales cuando se comparan con ==. Por ejemplo, 0.1 + 0.2 == 0.3 evalúa a False en Python. Utiliza float_compare(value1, value2, precision_digits=2) y float_is_zero(value, precision_digits=2) de odoo.tools.float_utils para comparaciones fiables. Este es un punto común en cualquier tutorial técnico de Odoo sobre el tema.
Uso de Float cuando Integer es la elección correcta
Si un campo siempre contiene números enteros, como un conteo, un número de paquetes o un número de secuencia, utiliza un campo Integer en su lugar. Los campos Float para números enteros no son técnicamente incorrectos, pero crean confusión innecesaria e invitan a los usuarios a ingresar valores decimales donde ninguno tiene sentido en el contexto empresarial.
No manejar valores False en métodos de cálculo
Un campo Float sin un valor predeterminado devuelve False (no 0.0) cuando aún no se ha establecido ningún valor. Si estás realizando cálculos basados en campos Float, siempre verifica si es False antes de hacer aritmética, o simplemente añade default=0.0 a la definición del campo. Esto previene excepciones TypeError en los métodos de cálculo que solo aparecen durante escenarios de datos reales.
Conclusión
El campo Float es un bloque de construcción fundamental del modelo de datos de Odoo. Maneja números decimales en precios, cantidades, tasas y medidas, y lo hace de manera fiable cuando se configura con la precisión y los valores predeterminados correctos.
Las principales cosas a tener en cuenta: utiliza grupos de precisión nombrados para valores estándar, utiliza Monetary en lugar de Float para montos en moneda, siempre establece un valor predeterminado y documenta tus convenciones para campos de porcentaje. Estos hábitos previenen los problemas de calidad de datos más comunes antes de que tengan la oportunidad de causar problemas en producción.
Ya sea que estés añadiendo campos a través de Odoo Studio, escribiendo un módulo personalizado en Python, o gestionando tu modelo de datos programáticamente a través del ORM de Odoo o la API XML-RPC, hacer bien los campos Float desde el principio resulta en una implementación más limpia y fiable en general.
En Dasolo, ayudamos a las empresas a implementar, personalizar y optimizar Odoo en todos los departamentos. Ya sea que necesites ayuda para diseñar un modelo de datos limpio, añadir campos personalizados a tus formularios, o construir un módulo completo de Odoo desde cero, nuestro equipo está aquí para apoyarte. Contáctanos y hablemos sobre tu proyecto de Odoo.