Consultas Django(filter())

Arian Ventura Rodríguez
2 min readMay 12, 2022

Django cuenta con un poderoso ORM que nos permite realizar desde una consultas de forma simple.
Suponemos que el lector posee un proyecto Django con un modelo llamado `Person` con los siguientes campos:

Para realizar una consulta, debe importar el modelo e instanciar la clase `QuerySet` de la siguiente manera:

En la consulta anterior, se instanció la clase `QuerySet` en el modelo `Person`, usamos el método `all()` para que devuelva todos los elementos de del modelo y el resultado se asignó a la variable `people`.

Ahora necesitamos realizar una consulta que devuelva todos los elmentos del modelo en donde el género sea masculino, para ello instanciamos la clase `QuerySet` utilizando el método `filter()` de la siguiente forma:

Nota: puede consultar los métodos de la clase `QuerySet` en la documentación oficial de Django ya que todos no serán utilizados en este artículo. https://docs.djangoproject.com/en/4.0/ref/models/querysets

Una consulta utilizando el método `filter()` con más de una condición, será de la siguinete forma:

En este caso devolverá todas las personas de género masculino y que su país sea Cuba.

Ahora imaginemos que necesitamos realizar la consulta anterior de forma reiterada y no queremos escribir el mismo código constantemente.

Como solución, tenemos un método `QuerySet` llamado `as_manager()`, que nos permite crear un método personalizado para una instancia de `QuerySet` de un modelo determinado, lo cual explico paso a paso:

En primer lugar, crearemos la clase manager que llamaremos `PersonQuerySet`, tenga en cuenta que esta clase debe heredar de la clase `QuerySet` de Django, para ello usaremos la siguiente instrucción:

Dentro de la clase `PersonQuerySet` creamos los métodos personalizados, que en este caso nos permitirán consultar a personas de género masculino y que su país sea Cuba, llamaremos al método `cuban_masculine()` quedando de la siguiente forma:

Para poder utilizar nuestro método `cuban_masculine()`, debemos crear una instancia de la clase `PersonQuerySet` y asignarla al atributo `objects` del modelo `Person`, quedando de la siguiente forma:

A partir de éste momento, cada vez que sea necesario obtener las personas del género masculino y que su país sea Cuba, podemos realizar la siguiente instrucción:

El ORM de Django nos permite realizar consultas con filtros condicionales. Para ello, podemos usar el método `filter()` con una instancia de la clase `Q`.

Para demostrarlo realizaremos una consulta para obtener las personas de Argentina o Brasil y del género femenino:

Siendo los operadores lógicos `Y` el símbolo `&` y `OR` el símbolo `|`, en el caso del operador lógico `NOT` se antepone el símbolo `~` al objeto `Q`, por ejemplo, realizaremos una consulta para obtener las personas del género masculino que no sean de Chile:

Muchas gracias por leer, espero que este artículo le sirva de ayuda.

--

--