Foros del Web » Programando para Internet » Python »

[SOLUCIONADO] Cuando usar GenericForeignKey

Estas en el tema de Cuando usar GenericForeignKey en el foro de Python en Foros del Web. Buenas que tal, aun no entiendo muy bien el tema de "The contenttypes framework" que esta en la documentación de Django. La idea es que ...
  #1 (permalink)  
Antiguo 11/06/2013, 07:49
colextey
Invitado
 
Mensajes: n/a
Puntos:
Cuando usar GenericForeignKey

Buenas que tal, aun no entiendo muy bien el tema de "The contenttypes framework" que esta en la documentación de Django.

La idea es que quiero saber cuando usar la relación GenericForeignKey.

Digamos que tenemos 6 modelos:
------------------------------
Estos vendrían hacer los modelos principales.
model.Film. model.Serie.
------------------------------
##################
--------------------------------------
Dos modelos idénticos con una relación forenignkey uno a model.film y el otro al de serie.
Estaba pensando usar aqui GenericForeignKey, así solo tendría un único modelo, pero no se si en la practica esto me vaya a dar problemas.
model.FilmInfo model.SerieInfo
--------------------------------------
##################
--------------------------------------
Dos modelos muy parecidos a los de arriba, creo que aquí también se podría usar una relación de tipo GenericForeignKey. Pues por lo que tengo entendido no hay que especificar hacia que modelo iría la relación.
model.FilmVideo model.SerieVideo
--------------------------------------

De esta manera nos ahorraremos de 6 modelos pasamos a solo 4. Que opinan ustedes. Definitivamente es mejor usar una relación de tipo ForeignKey.

Gracias.
  #2 (permalink)  
Antiguo 11/06/2013, 13:12
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Cuando usar GenericForeignKey

No tengo idea de como aplicarías un GenericForeignKey en esta situación.

Aquí hay una excelente presentación que explica no solo un GenericForeignKey si no otros patrones genéricos. http://www.slideshare.net/erics1/pow...ns-with-django

Tal vez si explicas mejor las relaciones que deseas tener en tus modelos te podamos orientar mejor.
  #3 (permalink)  
Antiguo 12/06/2013, 10:41
colextey
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Cuando usar GenericForeignKey

Hola @razpeitia, me viene muy bien el tutorial anterior de verdad que sí, bueno voy a describir mejor los modelos quizas pueda obtener una valoración mejor y me puedas orientar, que de antemano te agradezco.

Código Python:
Ver original
  1. class Film(models.Model):
  2.     """ modelo para peliculas """
  3.     title = models.CharField(max_length=100)
  4.     slug = models.SlugField()
  5.     body = models.TextField()
  6.  
  7. class Serie(models.Model):
  8.     """ modelo para series de tv  """
  9.     title = models.CharField(max_length=100)
  10.     slug = models.SlugField()
  11.     body = models.TextField()
  12.  
  13. class FilmInfo(models.Model):
  14.     """ modelo sobre información de las peliculas,trailer,imagen..etc """
  15.     film = models.ForeignKey(Film)
  16.     trailer = models.TextField()
  17.     image = models.ImageField(upload_to="imagenes")
  18.     duration = models.IntegerField()
  19.     created_at = models.DateTimeField(auto_now=True)
  20.  
  21.  
  22. class SerieInfo(models.Model):
  23.     """ modelo sobre información de las series:trailer,imagen..etc """
  24.     serie = models.ForeignKey(Serie)
  25.     trailer = models.TextField()
  26.     image = models.ImageField(upload_to="imagenes")
  27.     duration = models.IntegerField()
  28.     created_at = models.DateTimeField(auto_now=True)
  29.  
  30. class FilmShare(models.Model):
  31.     """ Links sobre todo lo relacionado a la película, vendria como inline
  32.         en FilmInfo.
  33.    """
  34.     filminfo = models.ForeignKey(FilmInfo)
  35.     link_information = models.URLField()
  36.     created_at = models.DateTimeField(auto_now=True)
  37.     updated_at = models.DateTimeField(auto_now_add=True)
  38.  
  39. class SerieShare(models.Model):
  40.     """ Links sobre todo lo relacionado a la Serie, vendria como inline
  41.         en SerieInfo.
  42.    """
  43.     serieinfo = models.ForeingKey(SerieInfo)
  44.     link_information = models.URLField()
  45.     created_at = models.DateTimeField(auto_now=True)
  46.     updated_at = models.DateTimeField(auto_now_add=True)

Si notas está, los modelos FilmInfo y SerieInfo que podrían ser ambos un solo modelo, el problema es que no me parece un buen estilo "Asociar dos Foreingkeys", uno a model.Film y otro a model.Serie en un solo modelo, por lo mismo cree los modelos model.FilmInfo y model.SerieInfo.

Pasa lo mismo con los modelos FilmShare y SerieShare. Que me recomiendas hacer.

Gracias.
  #4 (permalink)  
Antiguo 12/06/2013, 13:57
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
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)

Etiquetas: django, usar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:46.