3. Modelos, campos y relaciones
Objetivos
- elegir conscientemente los tipos de campo
- modelar correctamente Many2One, One2Many y Many2Many
- evitar duplicar datos empresariales
Modelo mental
Este concepto debe entenderse como parte de un sistema transaccional: la interfaz ayuda al usuario, el servidor conserva las reglas y la base persiste el resultado. Las relaciones expresan propiedad y ciclo de vida. Many2One almacena la clave foránea; One2Many presenta su relación inversa; Many2Many requiere un modelo de relación explícito.
Práctica guiada
- Haga que Autor sea independiente.
- Vincule cada Libro con un Autor.
- Exponga los libros del Autor mediante One2Many.
- Use un modelo intermedio solo cuando ambos lados admitan varios registros.
- Decida eliminación y obligatoriedad partiendo de la regla empresarial.
Ejemplo mínimo
class Author(ModelSQL, ModelView):
"Author"
__name__ = 'library.author'
name = fields.Char("Name", required=True)
books = fields.One2Many('library.book', 'author', "Books")
class Book(ModelSQL, ModelView):
"Book"
__name__ = 'library.book'
title = fields.Char("Title", required=True)
author = fields.Many2One(
'library.author', "Author", required=True,
ondelete='RESTRICT')
price = fields.Numeric("Price", digits=(16, 2))
published_on = fields.Date("Published On")
Cómo leer el ejemplo
No copie author_name dentro del libro solo para mostrarlo. Tryton atraviesa relaciones; los valores duplicados divergen salvo que exista una razón histórica documentada.
Ejercicio
Agregue Género y una relación Many2Many. Explique por qué el modelo intermedio necesita dos Many2One y una restricción de unicidad.
Realice el ejercicio primero con un caso mínimo, después agregue un caso inválido y convierta ambos en pruebas repetibles.
Resultado verificable
Se rechaza eliminar un autor usado por un libro y la relación puede recorrerse desde ambos lados.
Errores frecuentes
- usar Float para dinero
- confundir One2Many con una lista almacenada
- usar CASCADE sin analizar la pérdida de datos
- colocar datos por compañía en un maestro global
Criterio para avanzar
- Puedo explicar la diferencia entre los conceptos sin mirar el código.
- El caso válido y el inválido tienen pruebas.
- Probé con un usuario sin privilegios administrativos.
- Sé cómo actualizar y cómo recuperar la base de entrenamiento.
Versión y referencias
La serie 6.0 requiere como mínimo Python 3.6 según los metadatos oficiales. Esta rama oficial todavía conserva metadatos históricos en setup.py; mantenga compatibilidad con la serie, pero prepare sus paquetes personalizados para la construcción estándar mediante python -m build. No confunda ese mínimo histórico con la versión de Python que haya certificado su organización.
Esta edición fija ejemplos y dependencias en la serie 6.0. Consulte el tutorial oficial 6.0, la API del servidor y el código de esa rama antes de trasladar el patrón a producción.