La consulta de datos utilizando Django ORM es una de las características más poderosas de Django. QuerySet es la herramienta básica para obtener datos de manera eficiente desde los modelos de Django, y utilizando esta herramienta se pueden manejar fácilmente consultas de datos complejas. En este artículo, exploraremos qué es un QuerySet, cómo se puede utilizar y diversas funciones útiles para la consulta de datos.


1. ¿Qué es un QuerySet?

Un QuerySet es un conjunto de objetos que se utiliza en Django ORM para recuperar o manipular datos desde la base de datos. En otras palabras, un QuerySet es el conjunto de resultados de ejecutar una consulta (Query) en la base de datos. Con un QuerySet, se pueden obtener, filtrar y manipular objetos de modelos.

El QuerySet encapsula la interacción con la base de datos, permitiendo a los desarrolladores consultar o manipular datos usando código Python intuitivo sin necesidad de escribir SQL directamente.

Infografía de Django QuerySet

Lo que se puede hacer con un QuerySet

  • Consulta de datos: Se pueden consultar registros almacenados en la base de datos bajo diversas condiciones.
  • Filtrado: Se pueden aplicar varias condiciones para seleccionar solo los datos deseados.
  • Ordenación y fragmentación: Se pueden ordenar los datos en el orden deseado o obtener datos dentro de un rango específico.

2. Tipos de métodos de consulta básicos y ejemplos de uso

Django ORM proporciona una variedad de métodos de consulta básicos. Estos métodos son muy útiles para consultar y filtrar datos fácilmente.

2.1 all()

Este método se utiliza para obtener todos los datos del modelo.

from myapp.models import Post

posts = Post.objects.all()
  • Post.objects.all() obtendrá todos los objetos almacenados en el modelo Post.

2.2 filter()

Se utiliza para obtener solo los objetos que cumplen con ciertas condiciones.

published_posts = Post.objects.filter(status='published')
  • filter() consulta los objetos que coinciden con las condiciones, y el resultado devuelto es un QuerySet.

2.3 exclude()

Se utiliza para obtener objetos que no cumplen con ciertas condiciones.

draft_posts = Post.objects.exclude(status='published')
  • exclude() consulta los objetos que no coinciden con las condiciones, a diferencia de filter().

2.4 get()

Se utiliza para obtener un único objeto que cumple con ciertas condiciones. Sin embargo, se producirá un error si no hay objetos que coincidan o si hay más de uno.

post = Post.objects.get(id=1)
  • get() se utiliza para obtener exactamente un objeto, y si no hay resultado o hay más de uno, se generará la excepción DoesNotExist o MultipleObjectsReturned.

3. Operadores y filtrado en ORM

Los QuerySets pueden manejar condiciones de filtrado complejas utilizando diversos operadores. Al utilizar estos operadores, se pueden filtrar datos con condiciones muy específicas.

3.1 exact

Se utiliza para buscar valores que coincidan exactamente.

post = Post.objects.filter(title__exact='My First Post')
  • title__exact filtra los objetos cuyo título es exactamente 'My First Post'.

3.2 icontains

Se utiliza para buscar si un subcadena está presente sin distinguir entre mayúsculas y minúsculas.

posts = Post.objects.filter(title__icontains='django')
  • title__icontains consulta todos los posts cuyo título contiene 'django'.

3.3 gt, lt (mayor que, menor que)

Se utiliza para establecer condiciones de mayor o menor en valores numéricos o de fecha.

recent_posts = Post.objects.filter(publish_date__gt='2024-01-01')
  • publish_date__gt filtra los posts publicados después de 2024-01-01. gt significa greater than, y lt significa less than.

Además de estos, se pueden utilizar diversos operadores como startswith, endswith, in para implementar diversas condiciones de filtrado de manera sencilla.


4. Referencia inversa: consultando relaciones entre modelos conectados por claves foráneas

En Django ORM, la referencia inversa implica consultar datos a través de relaciones entre modelos utilizando una clave foránea (Foreign Key). Al utilizar referencias inversas, se pueden consultar de manera conveniente las relaciones entre padres e hijos en una base de datos relacional.


4.1 Referencia inversa utilizando related_name

Al definir una clave foránea, se puede usar la opción related_name para emplear nombres más legibles al realizar referencias inversas.

Ejemplo
class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()

class Comment(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments')
    text = models.TextField()
Uso
post = Post.objects.get(id=1)
comments = post.comments.all()
  • Al usar post.comments.all(), se pueden obtener todos los comentarios relacionados con ese post. Si no se estableció related_name, se utilizaría por defecto el nombre comment_set.

Conclusión

El QuerySet de Django ORM es una herramienta poderosa para interactuar con bases de datos, permitiendo consultar y manipular datos de manera eficiente a través de diversos métodos y operadores. En este artículo, vimos las formas básicas de uso del QuerySet, así como cómo filtrar datos y realizar referencias inversas.

Las secciones anteriores son solo una introducción muy básica a las funciones de consulta de ORM. En realidad, el QuerySet de Django tiene muchos más métodos variados y potentes, y se pueden combinar estos métodos para consultar datos. En el futuro, planeo escribir un artículo para introducir y analizar cada uno de los diversos métodos de QuerySet.

En el próximo artículo, abordaremos la optimización del rendimiento de QuerySet y el concepto de evaluación perezosa (lazy evaluation), para conocer mejores métodos de acceso a los datos. ¡Estén atentos!