Skip to main content

MODELOS

Los modelos en Odoo son la base de la arquitectura del framework.
Cada modelo representa una tabla en la base de datos y define su estructura, relaciones y lógica de negocio.


1. Definición de un modelo

Un modelo se define como una clase de Python que hereda de models.Model.
Cada clase corresponde a una tabla en PostgreSQL, y cada campo de la clase a una columna.

from odoo import models, fields, api

class MiModelo(models.Model):
_name = 'mi_modulo.mi_modelo' # Nombre técnico del modelo (tabla)
_description = 'Descripción del modelo'
_rec_name = 'nombre' # Campo que se mostrará como nombre por defecto

# Campos (atributos)
nombre = fields.Char(string='Nombre', required=True)
edad = fields.Integer(string='Edad')

🔹 _name → Define el nombre técnico del modelo (crea la tabla mi_modulo_mi_modelo).
🔹 _description → Descripción legible del modelo.
🔹 _rec_name → Campo usado por Odoo para mostrar el nombre del registro (en vistas, relaciones, etc.).
🔹 Los campos (fields) definen los atributos de la tabla.


2. Tipos de campos (fields)

Los campos son las columnas de la tabla del modelo.
Cada tipo de dato tiene su clase dentro del módulo odoo.fields.

TipoDescripciónEjemplo
CharTexto cortonombre = fields.Char(string='Nombre')
TextTexto largodescripcion = fields.Text(string='Descripción')
IntegerNúmeros enterosedad = fields.Integer(string='Edad')
FloatNúmeros decimalesprecio = fields.Float(string='Precio')
BooleanVerdadero/Falsoactivo = fields.Boolean(string='Activo', default=True)
DateFechafecha = fields.Date(string='Fecha')
DatetimeFecha y horacreado = fields.Datetime(string='Creado el')
SelectionLista de opcionesestado = fields.Selection([('a','Activo'),('i','Inactivo')], string='Estado')
BinaryArchivos o imágenesfoto = fields.Binary(string='Foto')

3. Relaciones entre modelos

Odoo permite conectar tablas mediante relaciones.
Existen tres tipos principales:

Many2one (muchos a uno)

Representa una clave foránea.
Ejemplo: varios empleados pertenecen a un mismo departamento.

departamento_id = fields.Many2one('mi_modulo.departamento', string='Departamento')

En base de datos: se añade una columna departamento_id con la referencia al registro relacionado.


One2many (uno a muchos)

Define el lado opuesto de Many2one.
Ejemplo: un departamento tiene muchos empleados.

empleado_ids = fields.One2many('mi_modulo.empleado', 'departamento_id', string='Empleados')

No crea columna nueva: se apoya en el campo Many2one del otro modelo.


Many2many (muchos a muchos)

Relaciona registros de ambas tablas sin dependencia directa.
Crea una tabla intermedia automáticamente.

proyecto_ids = fields.Many2many('mi_modulo.proyecto', string='Proyectos')

Un empleado puede participar en varios proyectos, y un proyecto tener varios empleados.


4. Métodos en los modelos

Los modelos pueden incluir métodos Python para aplicar lógica de negocio:

Métodos estándar

MétodoDescripción
create(self, vals)Sobrescribe la creación de registros.
write(self, vals)Modifica registros existentes.
unlink(self)Elimina registros.
name_get(self)Define cómo se muestra el nombre de los registros.

Ejemplo:

@api.model
def create(self, vals):
record = super().create(vals)
print("Registro creado:", record.nombre)
return record

5. Decoradores del API (@api)

Los decoradores permiten controlar cómo se ejecutan los métodos:

DecoradorDescripción
@api.modelMétodo que no depende de un registro específico.
@api.multi (deprecated en v13+)Método que trabaja sobre varios registros.
@api.depends('campo1', 'campo2')Marca campos calculados.
@api.onchange('campo')Se ejecuta al cambiar un campo en la vista.
@api.constrains('campo')Valida reglas antes de guardar.

Ejemplo de campo calculado:

edad = fields.Integer(compute='_calcular_edad')

@api.depends('fecha_nacimiento')
def _calcular_edad(self):
for record in self:
record.edad = date.today().year - record.fecha_nacimiento.year

6. Restricciones y validaciones

Puedes usar restricciones SQL o validadiones en Python.

Restricciones SQL

Evita duplicados o asegura condiciones en la base de datos.

_sql_constraints = [
('dni_unico', 'unique(dniEmpleado)', 'El DNI debe ser único.')
]

Validaciones con @api.constrains

Valida antes de guardar un registro.

@api.constrains('edad')
def _check_edad(self):
for record in self:
if record.edad < 18:
raise ValidationError("El empleado debe ser mayor de edad.")

7. Campos calculados y dependencias

Un campo calculado (compute) no se almacena en la base de datos salvo que se use store=True.

total = fields.Float(compute='_compute_total', store=True)

@api.depends('precio', 'cantidad')
def _compute_total(self):
for record in self:
record.total = record.precio * record.cantidad

8. Relación con las vistas

Los modelos se reflejan en la interfaz mediante vistas XML:

<record id="view_empleado_form" model="ir.ui.view">
<field name="name">erciapps.empleado.form</field>
<field name="model">erciapps.empleado</field>
<field name="arch" type="xml">
<form string="Empleado">
<sheet>
<group>
<field name="nombreEmpleado"/>
<field name="departamento_id"/>
</group>
</sheet>
</form>
</field>
</record>

9. Esquema conceptual

models.Model        → Clase de Python

Campos (fields) → Columnas de la tabla

Relaciones → One2many, Many2one, Many2many

Vistas XML → Interfaz en Odoo

10. Resumen

ConceptoSignificado
models.ModelClase base de todos los modelos.
_nameNombre técnico del modelo (nombre de la tabla).
_rec_nameCampo mostrado como nombre del registro.
fields.*Define los atributos del modelo.
RelacionesVinculan modelos entre sí.
@api.*Decoradores para lógica de negocio.
_sql_constraintsRestricciones de base de datos.

ACTIVIDAD PROPUESTA

👀 Ver actividad

Desarrolla el modelo adecuado a la temática asignada. NECESARIO INVESTIGAR Y AÑADIR UN CAMPO FIELD DISTINTO A LOS VISTOS.

Enunciados de diseño de bases de datos

Cada ejercicio debe desarrollarse de forma individual.
El primer paso será diseñar el modelo entidad-relación, indicando entidades, atributos, claves y relaciones.
Podrán incluir 3 o 4 entidades como máximo, y solo una relación N:M (tabla intermedia).


TEMÁTICA 1. Biblioteca escolar

Diseña una base de datos para gestionar los préstamos de una biblioteca.
Debe incluir libros, alumnos y préstamos.
Cada préstamo relaciona un alumno con un libro y guarda la fecha de préstamo y la fecha de devolución prevista.


TEMÁTICA 2. Taller mecánico

Crea un modelo para un taller que registra vehículos, clientes y reparaciones.
Un cliente puede tener varios vehículos, y cada reparación está asociada a un vehículo.
Guarda también la fecha de entrada, fecha de salida y coste total.


TEMÁTICA 3. Academia de idiomas

Diseña una base de datos para una academia que ofrece cursos a alumnos, impartidos por profesores.
Un curso puede tener varios alumnos, y un alumno puede estar en varios cursos (relación N:M).
Incluye la fecha de inicio y nivel del curso.


TEMÁTICA 4. Centro deportivo

Un centro deportivo quiere gestionar sus socios, monitores y actividades.
Cada socio puede apuntarse a varias actividades, y cada monitor puede impartir varias actividades.
Guarda el nombre de la actividad, nivel y precio mensual.

TEMÁTICA 5. Restaurante

Modela una base de datos para gestionar un restaurante con platos, ingredientes y categorías.
Cada plato puede tener varios ingredientes (relación N:M).
Añade el precio del plato y el tipo de plato (entrante, principal, postre).


TEMÁTICA 6. Hotel

Diseña una base de datos con habitaciones, clientes y reservas.
Cada reserva relaciona un cliente con una habitación y contiene fecha de entrada, fecha de salida y precio total.


TEMÁTICA 7. Universidad

Crea un modelo para gestionar profesores, asignaturas y facultades.
Cada profesor pertenece a una facultad y puede impartir varias asignaturas.
Guarda también el número de créditos de cada asignatura.


TEMÁTICA 8. Festival de música

Diseña una base de datos para organizar un festival.
Debe haber artistas, eventos y localizaciones.
Cada artista puede participar en varios eventos (N:M).
Guarda el nombre del evento, fecha y capacidad del recinto.


TEMÁTICA 9. Tienda online

Crea una base de datos con productos, clientes y pedidos.
Cada pedido pertenece a un cliente y puede incluir varios productos (N:M).
Registra la fecha del pedido y el importe total.


TEMÁTICA 10. Clínica veterinaria

Modela una base de datos para una clínica que atiende mascotas, propietarios y citas.
Cada cita asocia una mascota con una fecha de atención y una descripción del motivo.
Cada propietario puede tener varias mascotas.


TEMÁTICA 11. Plataforma de streaming

Diseña una base de datos con usuarios, películas y valoraciones.
Cada usuario puede valorar varias películas (N:M).
Cada valoración incluye la puntuación (1–5) y un comentario opcional.