Consultas Django(filter())
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.