Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Contenttypes Framework
Django incluye la aplicación contenttypes que rastrea todos los modelos instalados en
nuestro proyecto, proporcionando una interfaz genérica de alto nivel para trabajar con
ellos.
En el núcleo de la aplicación reside el modelo ContentType que se encuentra dentro del
módulo django.contrib.contenttypes.models . Las instancias de esta clase representan y
almacenan información sobre los distintos modelos instalados en el proyecto. De esta
manera, cada vez que se instalan nuevos modelos, se crean automáticamente nuevas
instancias de ContentType .
Las instancias de ContentType tienen métodos para devolver las clases de modelo que
representan y para consultar objetos de dichos modelos.
🍀 El modelo ContentType
Contenttypes Framework 1
Cada instancia de ContentType tiene dos campos que, en conjunto, describen de forma
única un modelo instalado: app_label que indica el nombre de la aplicación a la que
pertenece el modelo, y model que indica el nombre de la clase.
🍀 Relaciones genéricas
Agregar una clave foránea de uno de sus propios modelos a ContentType permite que el
modelo se vincule efectivamente a otra clase de modelo. Pero es posible ir un paso
más allá y usar el tipo de contenido para habilitar relaciones verdaderamente genéricas
entre modelos.
class TaggedItem(models.Model):
tag = models.SlugField()
def __str__(self):
return self.tag
Una clave foránea normal solo puede referenciar otro modelo, lo que significa que si el
modelo TaggedItem usa una clave foránea, tendría que elegir uno y solo un modelo para
almacenar las etiquetas. La aplicación contenttypes proporciona un tipo de campo
Contenttypes Framework 2
especial GenericForeignKey que soluciona esto y permite que la relación sea con
cualquier modelo:
Esto habilitará una API similar a la utilizada para una clave foránea normal, cada
TaggedItem tendrá un campo content_object que devuelve el objeto con el que está
guido = User.objects.get(username='Guido')
t = TaggedItem(content_object=guido, tag='bdfl')
t.save()
t.content_object # <User: Guido>
guido.delete()
t.content_object # None
Contenttypes Framework 3