Filtrar contenido del modelo en Django
Utilizando el ORM de Django es posible filtrar el contenido del modelo (consulta a la base de datos) sin tener muchos conocimientos de SQL.
El ORM de Django facilita colocar las instrucciones desde el código sin tener que tocar la base de datos.
En esta ocasión nos centraremos en ver los filtros para las vistas basadas en clases y las vistas basadas en funciones.
En ambos tipos de operaciones los filtros a los modelos son parecidos, utilizaremos la versión 2.2.5 de Django.
Nota. En los ejemplos se utiliza el modelo llamado Libros, con lo campos de id, descripción y estado. El modelo ya está migrado a la base de datos, es necesario para poder trabajar en los filtros.
Filtrar en vistas basada en clases
Una de las nuevas maneras de crear las vistas en Django es mediante la implementación de clases. Sin embargo, tiene incorporado casi todas las posibilidades que las vistas basadas en funciones.
Para agregar un filtro a este tipo de vistas podemos realizarlo de la siguiente manera.
from django.views import generic
class LibroView(generic.ListView):
queryset = Libros.objects.filter(estado = True)
template_name = 'home.html'
En el modelo Libros llamamos los objetos para realizar un filtro mediante el estado (true/false), que se almacena en un queryset.
Dentro del filter se coloca la columna de la tabla en bases de datos comparado con el valor de filtro.
Filtrar en vistas basada en funciones
Esta forma de mostrar el contenido de los modelos es la que se ha estado utilizando en versiones anteriores de Django y se sigue utilizando en algunos casos.
El siguiente código muestra cómo se utiliza el filtro en los modelos.
from django.shortcuts import render
def LibroView(request):
libro = Libros.objects.filter(estado = True)
return render(request, 'home.html', {'obj':libro})
En el modelo Libros se llaman a los objetos para el filtro de datos mediante una columna de la tabla.
Podría interesarte Primera aplicación web con Django
Puedes notar que en ambos casos la utilización del método filter es similar, que la puedes utilizar tanto en funciones como en clases.
Para agregar más de un filtro a tu modelo puedes agregar otro método filter después del paréntesis de cierre.
libro = Libros.objects.filter(estado = True).filter(id = 5)