DEV Community

loading...
Cover image for ¿Qué hace la aplicación ContentType en Django?

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

Eduardo Zepeda
Python, Javascript and GNU/Linux enthusiast. Django, React, FastAPI, TailwindCSS. Debian user since 2010
Originally published at coffeebytes.dev ・3 min read

¿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 uno de los mejores libros para comenzar con 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 probar vamos a crear un projecto de django, con un modelo:

Primero creemos un entorno virtual con pipenv. Si no sabes como se usa pipenv puedes visitar mi entrada donde hablo de Pipenv.

pipenv shell
Enter fullscreen mode Exit fullscreen mode

Una vez en nuestro entorno virtual, instalemos Django

pipenv install django
Enter fullscreen mode Exit fullscreen mode

Creemos un proyecto:

django-admin startproject videogameStore
cd videogameStore
Enter fullscreen mode Exit fullscreen mode

Ahora crearemos una app para nuestra aplicación.

django-admin startapp videogame
cd videogame
Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode

Hay que recordar agregar nuestra app recien creada a nuestro archivo settings.py

INSTALLED_APPS = [
    ...,
    'videogame'
]
Enter fullscreen mode Exit fullscreen mode

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
...
Enter fullscreen mode Exit fullscreen mode

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

python manage.py shell
Enter fullscreen mode Exit fullscreen mode

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='product', model="product")
<ContentType: videogame | videogame>
Enter fullscreen mode Exit fullscreen mode

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(Product)
<ContentType: videogame | videogame>
Enter fullscreen mode Exit fullscreen mode

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='product', model="product").id
7
Enter fullscreen mode Exit fullscreen mode

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>
Enter fullscreen mode Exit fullscreen mode

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

¿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.

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

Discussion (0)