Ver Mensaje Individual
  #4 (permalink)  
Antiguo 12/06/2013, 13:57
Avatar de razpeitia
razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 9 meses
Puntos: 1360
Respuesta: Cuando usar GenericForeignKey

Mira realmente depende mucho de los campos de los modelos.

En tu caso hay muchos campos repetidos. Ademas si quieres agregar algún nuevo tipo de animación como Anime tendrías que agregar mas modelos. Aquí mi solución es tener un modelo mas general ademas de agregarle un modelo extra llamado tipo que define si es una serie, una película, un anime, etc... (Ver código al final del post)

Ahora si tus modelos tuvieran información (campos) completamente diferente uno de otros pero por alguna razón quieres que todos esos modelos diferentes tengan un ID única en común que no colisione entre ellos entonces eso es una relación polimorfica. Este tipo de relaciones generalmente se apegan muy bien a base de datos no relacionales NoSQL, un ejemplo clásico de este tipo de relaciones es modelar el inventario de un supermercado, donde todos los artículos tienen un o varios campos en común (como el precio, la cantidad o el nombre) y un ademas un campo en común y único (ej. el código de barras).

En ese tipo de relaciones SI puedes usar como dices el ContentType de django o django_polymorphic


Código Python:
Ver original
  1. class AnimationType(models.Model):
  2.     """ modelo para tipo """
  3.     name = models.CharField(max_length=100, unique=True)
  4.  
  5. class Animation(models.Model):
  6.     """ modelo para series de tv, peliculas, anime y cualquier tipo de animacion  """
  7.     type = models.ForeignKey(AnimationType)
  8.     title = models.CharField(max_length=100)
  9.     slug = models.SlugField()
  10.     body = models.TextField()
  11.  
  12. class AnimationInfo(models.Model):
  13.     """ modelo sobre información de las trailer,imagen..etc """
  14.     animation = models.ForeignKey(Animation)
  15.     trailer = models.TextField()
  16.     image = models.ImageField(upload_to="imagenes")
  17.     duration = models.IntegerField()
  18.     created_at = models.DateTimeField(auto_now=True)
  19.  
  20. class AnimationShare(models.Model):
  21.     """ Links sobre todo lo relacionado a la película, vendria como inline
  22.        en FilmInfo.
  23.    """
  24.     info = models.ForeignKey(AnimationInfo)
  25.     link_information = models.URLField()
  26.     created_at = models.DateTimeField(auto_now=True)
  27.     updated_at = models.DateTimeField(auto_now_add=True)