En la publicación anterior, presenté cómo manejar datos a través del ORM de Django, es decir, las operaciones CRUD (Crear, Leer, Actualizar, Eliminar). Esta vez, intentaré analizar más en profundidad qué es exactamente el administrador objects, cómo está estructurado y qué puede hacer. objects es un concepto clave que se debe conocer para entender correctamente el ORM de Django.


1. ¿Qué es el administrador objects?

Lo que aparece con más frecuencia en la estructura básica del modelo de Django es el objects manager. objects se conoce como el administrador (Manager) del modelo de Django y se encarga de consultar o manipular registros en la base de datos. En otras palabras, el administrador objects actúa como un puente entre la clase del modelo y la base de datos.

Diagrama del administrador de objetos de Django

La propiedad básica del modelo objects es una instancia de la clase Manager que proporciona Django. A través de esta instancia, se comunica con la base de datos para realizar tareas como crear, buscar, modificar o eliminar datos. Por ejemplo, puede acceder a los datos utilizando métodos como Post.objects.all() o Post.objects.create().


2. Función de la clase Manager

La clase Manager es la interfaz básica que se le asigna al modelo de Django para interactuar con la base de datos. A través de ella, se pueden realizar diversas consultas. Por defecto, Django genera automáticamente un Manager llamado objects para cada modelo, y se utiliza este Manager para manejar la mayoría de las operaciones CRUD.

Es probable que ya tenga cierto conocimiento o experiencia sobre cómo se implementa CRUD a través de objects. Como el código de ejemplo se trató en la entrega anterior, lo omitiré aquí.


3. Crear un Manager personalizado

Si bien el administrador objects que se proporciona de forma predeterminada es muy útil, a veces es necesario reutilizar ciertas lógicas de consulta o realizar consultas más complejas. En este caso, puede crear un administrador personalizado para agregar la funcionalidad deseada.

3.1 Definiendo una clase de Manager personalizada

Por ejemplo, vamos a crear un administrador personalizado que filtre solo las publicaciones que están públicas.

from django.db import models

class PublishedManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(status='published')

class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    status = models.CharField(max_length=10, choices=[('draft', 'Draft'), ('published', 'Published')])
    publish_date = models.DateTimeField(auto_now_add=True)

    # Agregando un manager personalizado además del manager básico objects
    published = PublishedManager()

En el ejemplo anterior, definimos un administrador personalizado llamado PublishedManager y lo agregamos al modelo Post. Este PublishedManager devuelve solo las publicaciones cuyo estado es 'published'. Ahora, al llamar Post.published.all(), se obtendrán solo las publicaciones públicas.

3.2 Utilización de un Manager personalizado

  • Reducción de código duplicado: En lugar de agregar condiciones de filtrado cada vez, usar un manager personalizado puede reducir la duplicación de código.
  • Encapsulamiento de lógica de consulta especializada: Puede personalizar la lógica de consulta de acuerdo con ciertas reglas de negocio y gestionarla de manera ordenada dentro del modelo.

4. Variadas operaciones que se pueden realizar con el administrador objects

El administrador objects de Django no solo proporciona las funcionalidades CRUD por defecto, sino que también admite una variedad de operaciones adicionales en la base de datos.

4.1 Filtrado de datos

  • filter(): Consulta múltiples objetos que cumplan con una condición.
    published_posts = Post.objects.filter(status='published')
  • exclude(): Consulta objetos que no cumplan con una condición específica.
    draft_posts = Post.objects.exclude(status='published')

4.2 Ordenamiento y segmentación

  • Ordenamiento: Puede utilizar el método order_by() para ordenar los datos.
    recent_posts = Post.objects.all().order_by('-publish_date')
  • Segmentación: Al igual que el segmentado de listas en Python, también puede segmentar un queryset para obtener un rango específico de datos.
    first_three_posts = Post.objects.all()[:3]

4.3 Usando funciones de agregación

El administrador objects también proporciona funciones de agregación. Por ejemplo, si desea conocer el número de publicaciones, puede usar el método count().

post_count = Post.objects.count()

También puede realizar operaciones de agregación como promedios y sumas usando el método aggregate().

from django.db.models import Avg
average_length = Post.objects.aggregate(Avg('content_length'))

5. El principio de funcionamiento del administrador objects

El administrador objects internamente crea un QuerySet, que es una colección de consultas para obtener datos de la base de datos. Cada vez que se llaman métodos como objects.all() o objects.filter(), Django genera un queryset y envía esa consulta a la base de datos cuando es necesario para obtener el resultado.

El queryset utiliza evaluación diferida (lazy evaluation). Esto significa que al crear el queryset, no se accede realmente a la base de datos, sino que la consulta se ejecuta en el momento en que se requieren los datos. Esto ayuda a evitar la ejecución de consultas innecesarias y permite un manejo de datos más eficiente.


Conclusión

El administrador objects de Django simplifica la interacción con la base de datos y es una poderosa herramienta que facilita el manejo de datos. Además de las funciones CRUD proporcionadas de forma predeterminada, se pueden definir administradores personalizados para reutilizar lógicas de consulta específicas o manejar tareas más complejas de manera simplificada. Además, debido a características como la evaluación diferida del queryset, también se permite un manejo de datos eficiente.

Al comprender profundamente el administrador objects del ORM de Django, podrá manejar la base de datos de manera más eficiente y reducir la duplicación de código, manteniendo un código limpio. Aumente la utilidad del administrador de modelos y considere implementar un manager personalizado siempre que sea necesario. Esto hará que el manejo de datos complejos en aplicaciones web sea mucho más fácil y flexible.

En la próxima entrega, abordaremos en profundidad QuerySets y consultas de datos. Una de las ventajas del ORM es que "No necesitas saber SQL", pero para aprovechar adecuadamente esta ventaja, el contenido del próximo artículo será muy importante. Espero que no se lo pierda.