Introducción
Cada formulario en Odoo contiene campos que al abrirse demandan una respuesta. Algunos deben rellenarse manualmente siempre, pero muchos admiten un valor inicial que ahorra tiempo y errores. Ese valor inicial —el valor por defecto— hace que la pantalla ya llegue útil, evitando pasos innecesarios y mejorando la experiencia de quien trabaja con el sistema.
Tanto si eres usuario que modifica formularios con Studio como si eres desarrollador escribiendo módulos, dominar cómo se asignan los valores por defecto evita pérdidas de tiempo y configuraciones silenciosas que luego son difíciles de rastrear y corregir.
En esta guía explico qué son los valores por defecto en Odoo, cómo los aplica el ORM, cuándo conviene usar valores estáticos o dinámicos y las formas de definirlos: desde Odoo Studio sin código hasta la implementación en Python.
¿Qué se entiende por valor por defecto en Odoo?
Dentro del ORM de Odoo, un valor por defecto es simplemente lo que se preasigna a un campo al crear un nuevo registro, antes de que el usuario introduzca nada. No impone una restricción: el usuario puede modificarlo. Su función es ofrecer un punto de partida coherente para facilitar el llenado de datos.
Casi todos los tipos de campo admiten un parámetro default: Char, Integer, Float, Boolean, Date, Many2one, Selection, etc. Ese valor puede ser un literal, una función (lambda) o una referencia a un método; cada opción tiene sentido según el contexto y la lógica que necesites implementar.
En Odoo Studio, los valores por defecto se establecen desde las propiedades del campo mediante una entrada sencilla. Esto permite a los responsables de negocio fijar valores estáticos sin tocar código, una forma práctica de mejorar la coherencia de los datos sin depender de desarrolladores.
Los defaults no suelen guardarse como columnas en la tabla; residen en la definición Python del modelo o en registros de ir.default según cómo se hayan configurado. Cuando se crea un nuevo registro, Odoo consulta esas fuentes y rellena el formulario antes de mostrarlo al usuario.
Cómo funciona el valor por defecto
Al abrir un formulario para crear un registro, Odoo invoca el método default_get() del modelo. Ese método recopila los defaults disponibles y devuelve un diccionario que asocia cada campo con su valor por defecto, que luego se utiliza para prellenar la pantalla.
En Odoo existen varias clases de defaults pensadas para situaciones distintas; conviene distinguirlas para elegir la más adecuada según el caso.
Defaults estáticos
Se trata de un valor fijo definido en el campo o a través de Studio —por ejemplo marcar un Booleano como True o dejar una selección en 'draft'. Son los más sencillos y cubren la mayoría de necesidades rutinarias del modelo de datos.
Defaults dinámicos (lambda o método)
Son funciones que se ejecutan al crear el registro y permiten que el valor dependa del contexto: la fecha actual, el usuario conectado, la compañía, etc. Por ejemplo, asignar por defecto al responsable el usuario que crea el registro o usar la fecha de hoy como fecha del documento.
En Python, los defaults estáticos y dinámicos se declaran en la definición del campo siguiendo las convenciones de desarrollo de Odoo.
from odoo import fields, models
class CrmLead(models.Model):
_inherit = 'crm.lead'
# Default estático
x_priority_level = fields.Selection(
[('low', 'Baja'), ('medium', 'Media'), ('high', 'Alta')],
string='Nivel de prioridad',
default='medium',
)
# Default dinámico: usuario actual
x_assigned_by = fields.Many2one(
'res.users',
string='Asignado por',
default=lambda self: self.env.user,
)
# Default dinámico: fecha de hoy
x_expected_date = fields.Date(
string='Fecha estimada de cierre',
default=lambda self: fields.Date.today(),
)
Defaults basados en el contexto
Algunas acciones pasan valores por defecto mediante el contexto usando la convención default_nombre_campo. Si creas un registro desde otra ficha relacionada, el contexto puede prellenar campos relacionales (por ejemplo, abrir una tarea desde un proyecto ya fija el proyecto). Esto forma parte de la forma en que fluyen las pantallas en Odoo y puede configurarse tanto por desarrolladores como por usuarios avanzados.
Defaults por usuario mediante ir.default
Odoo permite definir defaults específicos por usuario usando registros de ir.default. Un administrador puede fijar un valor por defecto para un usuario concreto; ese valor tendrá prioridad sobre el default del modelo. Es muy útil en entornos con preferencias distintas entre equipos y suele pasarse por alto en implementaciones comunes.
Orden de prioridad
Cuando existen varias fuentes de default para un mismo campo, Odoo las resuelve así: primero los ir.default a nivel de usuario, luego los de compañía, y finalmente el default definido en el modelo Python. Los valores pasados por contexto en tiempo de ejecución también pueden sobrescribir los defaults del modelo. Conocer este orden es clave para entender por qué un campo no muestra el valor que esperas.
Casos prácticos en la empresa
Los valores por defecto se usan en casi todos los módulos de Odoo. A continuación tienes ejemplos prácticos tomados de procesos habituales en la empresa.
CRM: vendedor por defecto en oportunidades
En CRM lo habitual es que el campo Responsable tome por defecto el usuario que está creando la oportunidad. Así cada comercial ve sus oportunidades sin tener que asignarlas manualmente. Técnico y práctico: se implementa con lambda self: self.env.user, pero su impacto real es mejorar la adopción del CRM y reducir tareas administrativas.
Ventas: condiciones de pago por defecto en pedidos
En ventas, al crear un pedido se rellenan automáticamente la tarificación y las condiciones de pago basadas en la ficha del cliente. Si un cliente tiene Net 30 configurado, ese término aparece en cada pedido nuevo, evitando errores humanos y asegurando que se aplican las condiciones pactadas, aunque distintos comerciales creen los pedidos.
Almacén: ubicaciones por defecto en movimientos
Al generar transferencias internas o ajustes, las ubicaciones origen y destino se rellenan con las configuradas en el almacén. El personal de almacén que trabaja siempre en una misma zona encuentra la ubicación correcta ya seleccionada, lo que agiliza procesos y minimiza el riesgo de seleccionar un sitio erróneo bajo presión.
Contabilidad: diario por defecto en asientos
Al crear facturas o abonos, Odoo selecciona el diario adecuado en función del tipo de asiento y de la configuración de la compañía. Esto evita que un contable tenga que elegir manualmente el diario cada vez y garantiza que los movimientos se registran según la configuración contable vigente.
Proyectos: fase por defecto en tareas nuevas
En proyectos, una tarea nueva suele iniciar en la primera fase del kanban del proyecto. Si la tarea se crea desde la ficha del proyecto, además el contexto puede prellenar el proyecto y el asignado. Estas pequeñas automatizaciones mantienen las tareas en el lugar correcto desde el primer momento y facilitan la organización del equipo.
Cómo crear o personalizar valores por defecto
Hay tres vías principales para definir defaults en Odoo: sin código con Studio, a través de Python en una personalización técnica, o creando registros de ir.default programáticamente.
Con Odoo Studio (sin código)
Studio ofrece una interfaz visual para fijar valores por defecto en cualquier campo de un formulario. Es la opción más accesible para usuarios de negocio que necesitan ajustes rápidos sin tocar código.
- Abre Studio en el formulario que quieras modificar
- Selecciona el campo que deseas configurar
- En el panel derecho de propiedades, localiza la entrada Default Value
- Introduce o selecciona el valor inicial que quieres establecer
- Guarda y sal de Studio
Studio guarda esa configuración como un registro de ir.default en la base de datos y suele aplicarse a nivel de compañía salvo que se restrinja por usuario. Es ideal para defaults estáticos en Selection, Boolean, Char o Integer; para campos Many2one puedes elegir un registro existente desde un desplegable. Es la forma más práctica de crear campos útiles sin programación.
Recuerda que cambiar un default en Studio no modifica registros ya creados; sólo afecta a los registros que se generen a partir del momento del cambio.
Mediante Python en personalizaciones técnicas
En desarrollos técnicos conviene definir los defaults en la declaración del campo dentro del modelo Python. Esto permite defaults estáticos, lambdas dinámicas y métodos complejos, y es la opción adecuada cuando el valor depende de información en tiempo de ejecución como usuario o compañía.
Ejemplo de defaults en un módulo personalizado:
from odoo import fields, models
class SaleOrder(models.Model):
_inherit = 'sale.order'
# Default booleano estático
x_requires_review = fields.Boolean(
string='Requiere revisión',
default=False,
)
# Default selección estático
x_delivery_preference = fields.Selection(
[('standard', 'Estándar'), ('express', 'Exprés')],
string='Preferencia de entrega',
default='standard',
)
# Default dinámico mediante método
def _default_note(self):
return self.env['ir.config_parameter'].sudo().get_param(
'sale.default_note', default=''
)
x_internal_note = fields.Text(
string='Nota interna',
default=_default_note,
)
Este patrón es el estándar en desarrollo Odoo y funciona con todos los tipos de campo. Los defaults basados en métodos son útiles cuando la lógica supera lo que una lambda puede expresar con claridad.
Crear registros de ir.default de forma programada
También puedes crear o actualizar registros de ir.default mediante la API XML-RPC o incluyendo datos en un fichero de datos del módulo. Sirve cuando quieres que un módulo instale una configuración por defecto al desplegarse, especificando modelo, campo, valor y, opcionalmente, compañía o usuario para acotar el alcance.
Aunque no es la técnica habitual del día a día, resulta útil al empaquetar configuraciones por defecto en módulos instalables.
Buenas prácticas para los valores por defecto en Odoo
Asigna defaults a campos obligatorios
Si un campo es obligatorio, establece un default razonable cuando sea posible. Esto evita errores al guardar y mejora la usabilidad: combinar required=True con un default práctico es una buena práctica para evitar fricciones al crear registros.
Usa lambdas para defaults de fecha
Nunca fijes una fecha estática como default. Emplea lambda self: fields.Date.today() para que la fecha sea la del momento de creación. Una fecha hardcodeada quedaría obsoleta inmediatamente y daría valores incorrectos.
Mantén la lógica de defaults ligera
Los defaults se ejecutan al inicializar un registro cada vez que se abre un formulario nuevo. Evita consultas pesadas, llamadas a APIs externas o cálculos costosos dentro de esas funciones. Si necesitas lógica compleja, valora usar un onchange o un campo compute que se desencadene desde otro campo en lugar de cargarlo todo en el default.
Usa defaults por contexto para flujos de navegación
Cuando diseñas acciones o botones que abren formularios, transmite default_nombre_campo en el contexto en vez de confiar en defaults estáticos del modelo. Así te alineas con el comportamiento nativo de Odoo y garantizas que la acción abra el formulario ya preconfigurado según la navegación del usuario.
Prueba los defaults con distintos perfiles de usuario
Los defaults que dependen de self.env.user o self.env.company cambian según el usuario conectado. Prueba siempre con al menos dos cuentas diferentes y, en setups multi-compañía, con distintas compañías para verificar el comportamiento real: lo que funciona para un administrador no siempre funciona igual para un usuario estándar.
Errores comunes a evitar
Evita objetos mutables como default
El error clásico de Python aplica en Odoo: no uses default=[] o default={}. Python comparte ese objeto entre instancias y los datos pueden filtrarse entre registros. Usa un lambda: default=lambda self: [] para crear una estructura nueva en cada inicialización.
Los defaults no disparan onchange
Asignar un default no activa los métodos onchange. Si tu formulario tiene onchanges que actualizan otros campos, esos efectos no se producirán cuando el valor venga de un default. Si necesitas reproducir esa lógica al crear el registro, tendrás que invocar el onchange desde una sobrecarga de default_get o mover la lógica a otro mecanismo que sí se ejecute en la inicialización.
Conflictos entre ir.default y la definición del modelo
Si defines un default en Python y otro mediante Studio o ir.default, el registro de ir.default prevalecerá sobre el default del modelo. Esa superposición suele causar confusión cuando, tras un cambio en Studio, un campo deja de mostrar el valor que el desarrollador había puesto en código.
No confundas default con obligatoriedad
Un campo con un valor por defecto no queda forzosamente protegido contra que el usuario lo borre. Si necesitas garantizar que siempre tenga contenido, combina el default con required=True en la definición del campo.
No uses IDs hardcodeadas para usuario o compañía
Evita defaults como default=1 que referencien registros por su ID de base de datos. Es frágil y falla en entornos donde los IDs no coinciden. Usa referencias dinámicas: lambda self: self.env.company.id o lambda self: self.env.ref('module.xml_id').id para que el default sea robusto entre instalaciones.
Conclusión
Los values por defecto son una herramienta pequeña pero de alto impacto en el modelo de datos de Odoo. Reducen entradas manuales, orientan a los usuarios hacia elecciones coherentes y simplifican los formularios. Sea mediante Studio para cambios rápidos o en Python para lógica avanzada, comprender su funcionamiento mejora significativamente cualquier implantación de Odoo.
Puntos clave a recordar: los defaults solo se aplican al crear registros; no disparan onchanges; existen fuentes múltiples con un orden de prioridad definido; y nunca uses objetos mutables sin envolverlos en una lambda.
Ajustar correctamente los defaults suele marcar la diferencia entre un formulario que resulta natural y otro que genera fricción cada vez que un usuario crea un registro. Es una pequeña inversión que ahorra tiempo y frustración en el día a día.
En Dasolo acompañamos a empresas en la implementación, personalización y optimización de Odoo para que encaje con sus procesos concretos. Si necesitas ayuda para configurar defaults, crear campos o diseñar un modelo de datos que funcione de verdad, podemos ayudarte. Contacta con nosotros y hablemos sobre tu implementación de Odoo.