relations generic framework python django django-models django-contenttypes generic-foreign-key

python - generic - Django: ¿Ejemplo de relaciones genéricas usando el framework contenttypes?



django generic relations (3)

De hecho, tengo una situación muy similar en uno de mis proyectos, con varios tipos de medios.

class TaggedItem(models.Model): tag = models.SlugField() content_type = models.ForeignKey(ContentType) object_id = models.PositiveIntegerField() content_object = generic.GenericForeignKey(''content_type'', ''object_id'') class ReviewedItem(models.Model): content_type = models.ForeignKey(ContentType) object_id = models.PositiveIntegerField() content_object = generic.GenericForeignKey(''content_type'', ''object_id'') review = models.ForeignKey("Review") class CreativeWork(models.Model): #other fields keywords = generic.GenericRelation("TaggedItem",null=True, blank=True, default=None) reviews = generic.GenericRelation("ReviewedItem",null=True, blank=True, default=None) class MediaObject(CreativeWork): #fields class VideoObject(MediaObject): #fields class AudioObject(MediaObject): #fields

Cada video o audio es un MediaObject, que es un CreativeWork. CreativeWorks tiene una relación genérica con las etiquetas y las revisiones. Así que ahora cualquier cosa puede ser etiquetada o revisada.

Todo lo que necesita es que la ''acción'' tenga una ForeignKey para ContentType. A continuación, agregue una relación genérica a su modelo. De hecho, encontré que el django.docs es bastante útil :) Pero si no, espero que esto ayude.

He revisado varias veces los documentos de Django con respecto al marco de los tipos de contenido, y simplemente no lo entiendo lo suficiente como para implementar relaciones genéricas en mi proyecto. He buscado ejemplos o tutoriales en línea sobre el tema, pero no puedo encontrar ninguno. Llámeme tonto, pero necesito ayuda en este caso (no responda simplemente enlazando a los documentos). Según la falta de recursos en línea, creo que si responde a esta pregunta con un ejemplo exhaustivo, su respuesta puede ser el ejemplo más útil en línea hasta la fecha en relación con las relaciones genéricas de django (¡bonificación!).

Entonces, mi pregunta es: ¿puede alguien mostrar un ejemplo simple de los modelos y tal vez un par de líneas de código que muestren cómo interactuar con instancias de un modelo genérico?

Como inspiración, esto es lo que creo que sería una situación muy común:

Un sitio tiene elementos multimedia que se tratan en gran medida de la misma manera, pero son ligeramente diferentes. Por ejemplo, digamos que hay elementos de imagen y video, y los usuarios pueden "gustar" un elemento o "comentar" sobre un elemento. Los "me gusta" y los comentarios deben tratarse de la misma manera, independientemente de si se publican en una imagen o elemento de video. Por lo tanto, si hay un ItemView para ver una imagen o un video en el álbum de un usuario, serían posibles los siguientes tipos de llamadas: mediaitem.comments.all() o len(mediaitem.likes.all()) o comment.user_who_commented , sin tener que saber qué tipo de elemento multimedia es (imagen o video).

Creo que necesitarías seis modelos para esto:

  • Resumen de clase MediaItem
  • Dos tipos diferentes de elementos de medios: ImageItem y VideoItem
  • Resumen de clase MediaItemActions
  • Dos tipos diferentes de acciones que se pueden hacer hacia los elementos de los medios: Like y Comment

Si sabe cómo usar esta función de Django, ¡muestre un ejemplo completo! Siento que sería una herramienta extremadamente poderosa y estoy deseando usarla en mi aplicación. Cuanto más explícito, mejor.


Otra opción son los modelos polimórficos . No diré que es la forma en que debe irse, pero tal vez podría ser una opción.

Soy fan de las claves externas genéricas y de los modelos polimórficos. Los modelos polimórficos funcionan mejor en aquellos escenarios donde hay mucha similitud en los modelos.


Su caso de uso suena muy similar al marco de comentarios de Django (ahora en desuso). Si revisa los models , verá cómo usar una relación genérica en BaseCommentAbstractModel note que necesita los tres campos, una ForeignKey to ContentType , un campo para contener los pk s de los objetos y el campo GenericForeignKey .

En cuanto a cómo consultar objetos por GenericForeignKey , puede ver algunos ejemplos en las etiquetas de plantilla en ese proyecto. Vea, por ejemplo, el método get_query_set en BaseCommentNode , que recupera los comentarios al consultar el tipo de contenido y pk del objeto de destino.

def get_query_set(self, context): ctype, object_pk = self.get_target_ctype_pk(context) if not object_pk: return self.comment_model.objects.none() qs = self.comment_model.objects.filter( content_type = ctype, object_pk = smart_text(object_pk), site__pk = settings.SITE_ID, )