Filtrar datos en Django Rest Framework

La vista de lista genérica de Django REST Framework, de forma predeterminada, devuelve los conjuntos de consultas completos para un administrador de modelos. Para aplicaciones del mundo real, es necesario filtrar el conjunto de consultas para recuperar los resultados relevantes según la necesidad. Entonces, analicemos cómo crear un servicio web RESTful que proporcione capacidades de filtrado. 

  • DjangoFilterBackend
  • Filtro de búsqueda
  • OrdenarFiltro

Nota: Puede consultar la sección API navegable para modelos, serializadores y vistas del proyecto utilizados en el artículo

DjangoFilterBackend

La clase DjangoFilterBackend se usa para filtrar el conjunto de consultas en función de un conjunto específico de campos. Esta clase de backend crea automáticamente una clase FilterSet ( django_filters.rest_framework.FilterSet ) para los campos dados. También podemos crear nuestra propia clase FilterSet con configuraciones personalizadas.

Para configurar las clases back-end de filtro en nuestro servicio web Django, necesitamos instalar el paquete django-filter en nuestro entorno virtual. Asegúrese de salir del servidor de desarrollo de Django (Ctrl + C) y active el entorno virtual. Ejecutemos el siguiente comando.

pip install django-filter

Después de la instalación, debemos definir la aplicación django_filters en INSTALLED_APPS en el archivo settings.py.

Python3

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # Django REST framework
    'rest_framework',
    'robots.apps.RobotsConfig',
    # Django Filters
    'django_filters',
]

Como siguiente paso, debemos configurar la clase DjangoFilterBackend de django_filters como la clase de filtro predeterminada. Mencionémoslo en el diccionario REST_FRAMEWORK en el archivo settings.py. 

Python3

REST_FRAMEWORK = {
    'DEFAULT_FILTER_BACKENDS'🙁
        'django_filters.rest_framework.DjangoFilterBackend',
    ),
}

Ahora nuestro servicio web RESTful está configurado para hacer uso de la función de filtrado proporcionada por la clase django_filters.rest_framework.DjangoFilterBackend . Filtremos la clase de robot que recupera una lista de robots. La clase RobotList de la siguiente manera:

Python3

class RobotList(generics.ListCreateAPIView):
    queryset = Robot.objects.all()
    serializer_class = RobotSerializer
    name = 'robot-list'
      
    filter_fields = (
        'robot_category',
        'manufacturer',
    )

Aquí, puede notar un atributo llamado filter_fileds donde especificamos el nombre del campo para filtrar. Ahora, podemos recuperar robots según su categoría (robot_category) y/o fabricante. 

Filtremos los robots según la categoría de robot. El comando HTTPie es

http “:8000/robot/?robot_category=2”

Producción:

Probemos con otro comando HTTPie que filtra los robots según la categoría y el fabricante del robot. El comando HTTPie es

http “:8000/robot/?robot_category=2&fabricante=1”

Producción:

Ahora verifiquemos la funcionalidad en la API navegable. Puede navegar por la siguiente URL

http://127.0.0.1:8000/robot/

Puede hacer clic en el botón Filtros en la esquina superior derecha para utilizar la función de filtro. Se mostrará como se muestra a continuación

Al hacer clic en el botón Enviar, obtendrá el resultado en función de los campos de filtro completados, como se muestra a continuación.

Filtro de búsqueda

La clase SearchFilter admite una sola función de búsqueda basada en parámetros de consulta y se basa en la función de búsqueda del administrador de Django.

De forma predeterminada, la clase SearchFilter utiliza coincidencias parciales que no distinguen entre mayúsculas y minúsculas y puede contener varios términos de búsqueda (deben estar separados por espacios en blanco y/o comas). También podemos restringir el comportamiento de búsqueda anteponiendo varios caracteres a search_fields. 

  • ‘^’ Comienza con la búsqueda.
  • ‘=’ Coincidencias exactas.
  • ‘@’ Búsqueda de texto completo. (para el backend PostgreSQL de Django)
  • Búsqueda de expresiones regulares ‘$’

De forma predeterminada, el parámetro de búsqueda se denomina búsqueda y puede anularlo con la configuración SEARCH_PARAM . Hagamos uso de la clase SearchFilter agregando la clase rest_framework.filters.SearchFilter al diccionario REST_FRAMEWORK

Python3

REST_FRAMEWORK = {
    'DEFAULT_FILTER_BACKENDS'🙁
        'django_filters.rest_framework.DjangoFilterBackend',
        'rest_framework.filters.SearchFilter',
    ),
}

Nuestra clase RobotList tiene el siguiente aspecto:

Python3

class RobotList(generics.ListCreateAPIView):
    queryset = Robot.objects.all()
    serializer_class = RobotSerializer
    name = 'robot-list'
      
    search_fields = (
        '^name',
    )

El atributo search_fields especifica una tupla de strings, que indica los nombres de campo que queremos incluir en la función de búsqueda. 

Busquemos los robots, que comienzan con el nombre ‘IRB’. El comando HTTPie es

http “:8000/robot/?search=IRB”

Producción:

OrdenarFiltro

La clase OrderingFilter le permite ordenar el resultado en función de los campos especificados. De forma predeterminada, el parámetro de consulta se llama ordering y se puede anular con la configuración ORDERING_PARAM . El atributo ordering_field especifica una tupla de strings, que indica los nombres de los campos para ordenar los resultados.

Si no especifica un atributo ordering_fields en la vista, la clase de filtro permite al usuario filtrar en cualquier campo legible especificado por el atributo serializer_class. Esto permite que el usuario ordene información confidencial, como campos hash de contraseña, etc., lo que puede provocar una fuga de datos inesperada. También puede especificar un orden predeterminado configurando un atributo de orden en la vista. Puede ser una string o una lista/tupla de strings.

Para hacer uso de   la clase OrderingFilter , debemos establecer la clase como la clase de filtro de pedido predeterminada en el diccionario REST_FRAMEWORK .

Python3

REST_FRAMEWORK = {
    'DEFAULT_FILTER_BACKENDS'🙁
        'django_filters.rest_framework.DjangoFilterBackend',
        'rest_framework.filters.OrderingFilter',
    ),
}

Mencionemos el atributo ordering_fields en la clase RobotList. El código de la siguiente manera:

Python3

class RobotList(generics.ListCreateAPIView):
    queryset = Robot.objects.all()
    serializer_class = RobotSerializer
    name = 'robot-list'
  
    ordering_fields = (
        'price',
    )

Ahora, recuperemos los robots en función del aumento en el pedido de precios. El comando HTTPie es

http “:8000/robot/?ordering=precio”

Producción:

Publicación traducida automáticamente

Artículo escrito por SonuGeorge y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *