Índice del contenido

¿Qué hace la aplicación ContentType en Django?

¿Qué hace la aplicación ContentType en Django?

¿Sabías que Django lleva un registro de cada uno de los modelos que creas para tu proyecto en un modelo llamado ContentType? Sigue leyendo para aprender al respecto.

¡Perdón por tardar tanto en escribir! He estado ocupado mudando el frontend de mi blog a Frontity, un framework de React para Wordpress, y también mudándome a un nuevo departamento. Quizás hable un poco al respecto de Frontity en alguna entrada futura. Por ahora continuemos con el tema.

Antes de empezar, si no tienes ninguna idea de para que sirve Django visita mi entrada donde hablo sobre la guia definitiva de Django Si ya has usado Django anteriormente, sigamos adelante.

ContentType y los modelos

ContentTypes es un modelo especial de Django que registra cada uno de los modelos que existen dentro de nuestra aplicación, tanto los que nosotros creamos, como los que vienen instalados por defecto.

¿Para que sirve ContentType?

ContentType sirve para relacionar modelos con otros modelos, como si fuera una foreign key (llave foránea), pero con la ventaja de que el tipo de modelo con el cual lo relacionemos puede ser diferente para cada entrada de la tabla.

Imagínate una sencilla red social, donde tenemos diferentes tipos de contenido; un modelo para videos, un modelo para imágenes y un modelo para textos. ContentType nos permite crear un modelo que haga referenciar a cualquiera de nuestros tres modelos de una manera sencilla.

¿Cómo usar ContentType?

Para ejemplificar como funciona ContentType vamos a crear un projecto de django, con un modelo:

Primero creemos un entorno virtual con Pipenv, el gestor de entornos virtuales .

pipenv shell

Una vez en nuestro entorno virtual, instalemos Django

pipenv install django

Creemos un proyecto:

django-admin startproject videogameStore
cd videogameStore

Ahora crearemos una app para nuestra aplicación.

django-admin startapp videogame
cd videogame

Ya que tenemos nuestra aplicación, habrá que crear un modelo, y, como ya te mencioné, Django automáticamente registrará ese modelo en su aplicación ContentType.

Lo primer que haremos será abrir nuestro archivo models.py y editar el contenido

from django.db import models

# Create your models here.

class Videogame(models.Model):
    name = models.CharField(max_length=256)
    created = models.DateTimeField(auto_now_add=True)
    modified    = models.DateTimeField(auto_now=True)

Hay que recordar agregar nuestra app recién creada a nuestro archivo settings.py

INSTALLED_APPS = [
    ...,
    'videogame'
]

Creamos las migraciones y las ejecutamos. Presta atención a como se crean migraciones para la aplicación ContentTypes en Django.

python3 manage.py makemigrations
Migrations for 'videogame':
  videogame/migrations/0001_initial.py
    - Create model Videogame
python3 manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions, videogame
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
...

Ahora tendremos un modelo registrado en ContentType. Vamos a corroborarlo directo desde la shell de Django.

python manage.py shell

Una vez en la terminal, importemos el modelo ContentType.

Justo como cualquier otro modelo, podemos usar su ORM para obtener los datos de los modelos.

Cada objecto del modelo ContentType tendrá una propiedad llamada app_label, y otra model, las cuales son el nombre de la aplicación y el nombre del modelo, respectivamente.

from django.contrib.contenttypes.models import ContentType
ContentType.objects.get(app_label='videogame', model="videogame")
<ContentType: videogame | videogame>

Si prefieres, también puedes acceder a la instancia de ContentType directamente desde el modelo usando el método get_for_model.

from videogame.models import Videogame
ContentType.objects.get_for_model(Videogame)
<ContentType: videogame | videogame>

Otros modelos guardados en ContentType de Django

Como ya sabes, cada entrada de una tabla tiene un identificador único, la id, mira lo que pasa si accedemos al id de la instancia que acabamos de crear.

ContentType.objects.get(app_label='videogame', model="videogame").id
7

Sí, como ya habrás deducido, hay más modelos registrados en la app de ContentType. Averigüemos cuales son.

>>> ContentType.objects.get(id=1)
<ContentType: admin | log entry>
ContentType.objects.get(id=2)
<ContentType: auth | permission>
ContentType.objects.get(id=3)
<ContentType: auth | group>
ContentType.objects.get(id=4)
<ContentType: auth | user>

Como ya mencioné, cada una de las apps instaladas de manera predeterminada cuentan con sus modelos respectivos.

Si quieres ahondar más en el tema por favor revisa la documentación oficial de Django.

Eduardo Zepeda
Desarrollador web, entusiasta de los sistemas GNU/Linux y el Software Libre. Py, Ts y Go, pero abierto a otras opciones como el Rustaceanismo. Creo en las bondades de las criptodivisas más allá de la especulación monetaria.
Leer más