Saltar al contenido principal
Versión: Tryton 8.0 (LTS)

3. Modelos, campos y relaciones

Tryton 8.0 · curso práctico versionado

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

  1. Haga que Autor sea independiente.
  2. Vincule cada Libro con un Autor.
  3. Exponga los libros del Autor mediante One2Many.
  4. Use un modelo intermedio solo cuando ambos lados admitan varios registros.
  5. 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 8.0 requiere como mínimo Python 3.10 según los metadatos oficiales. El servidor oficial ya declara su proyecto mediante pyproject.toml; los módulos nuevos deben construirse como paquetes modernos y comprobar el contenido del wheel. 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 8.0. Consulte el tutorial oficial 8.0, la API del servidor y el código de esa rama antes de trasladar el patrón a producción.