Filtrer les données dans Django Rest Framework

La vue de liste générique de Django REST Framework, par défaut, renvoie l’intégralité des ensembles de requêtes pour un gestionnaire de modèles. Pour les applications du monde réel, il est nécessaire de filtrer le jeu de requêtes pour récupérer les résultats pertinents en fonction du besoin. Voyons donc comment créer un service Web RESTful qui fournit des fonctionnalités de filtrage.

  • DjangoFilterBackend
  • Filtre de recherche
  • Filtre de commande

Noter: Vous pouvez vous référer L’API navigable section pour les modèles, les sérialiseurs et les vues du projet utilisées dans l’article

DjangoFilterBackend

La classe DjangoFilterBackend est utilisée pour filtrer le jeu de requêtes en fonction d’un ensemble de champs spécifié. Cette classe backend crée automatiquement un FilterSet (django_filters.rest_framework.FilterSet) classe pour les champs donnés. Nous pouvons également créer notre propre classe FilterSet avec des paramètres personnalisés.

Pour configurer les classes backend de filtrage dans notre service Web Django, nous devons installer le filtre django package dans notre environnement virtuel. Assurez-vous de quitter le serveur de développement Django (Ctrl + C) et d’activer l’environnement virtuel. Exécutons la commande ci-dessous.

pip install django-filter

Après l’installation, nous devons définir le django_filters application à INSTALLED_APPS dans le fichier settings.py.

Python3

INSTALLED_APPS = [

    'django.contrib.admin',

    'django.contrib.auth',

    'django.contrib.contenttypes',

    'django.contrib.sessions',

    'django.contrib.messages',

    'django.contrib.staticfiles',

    

    'rest_framework',

    'robots.apps.RobotsConfig',

    

    'django_filters',

]

Dans une prochaine étape, nous devons définir le DjangoFilterBackend classe de django_filters comme classe de filtre par défaut. Mentionnons-le au REST_FRAMEWORK dictionnaire dans le fichier settings.py.

Python3

REST_FRAMEWORK = {

    'DEFAULT_FILTER_BACKENDS'🙁

        'django_filters.rest_framework.DjangoFilterBackend',

    ),

}

Maintenant, notre service Web RESTful est configuré pour utiliser la fonction de filtrage fournie par django_filters.rest_framework.DjangoFilterBackend classer. Filtrons la classe robot qui récupère une liste de robots. La classe RobotList comme suit :

Python3

class RobotList(generics.ListCreateAPIView):

    queryset = Robot.objects.all()

    serializer_class = RobotSerializer

    name = 'robot-list'

     

    filter_fields = (

        'robot_category',

        'manufacturer',

    )

Ici, vous pouvez remarquer un attribut nommé filter_fileds où nous spécifions le nom du champ à filtrer. Désormais, nous pouvons récupérer des robots en fonction de leur catégorie (robot_category) et/ou de leur fabricant.

Filtrons les robots en fonction de la catégorie de robot. La commande HTTPie est

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

Production:

robotfilterrobocateg

Essayons une autre commande HTTPie qui filtre les robots en fonction de la catégorie et du fabricant du robot. La commande HTTPie est

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

Production:

robotfiltercatgmanuf

Vérifions maintenant la fonctionnalité de l’API navigable. Vous pouvez parcourir l’URL ci-dessous

http://127.0.0.1:8000/robot/

filter

Vous pouvez cliquer sur le bouton Filtres dans le coin supérieur droit pour utiliser la fonction de filtre. Il s’affichera comme indiqué ci-dessous

filter2

En cliquant sur le bouton Soumettre, vous obtiendrez le résultat basé sur les champs de filtre remplis comme indiqué ci-dessous.

filter3

Filtre de recherche

La Filtre de recherche La classe prend en charge une seule fonctionnalité de recherche basée sur un paramètre de requête, et elle est basée sur la fonction de recherche de l’administrateur Django.

Par défaut, Filtre de recherche La classe utilise des correspondances partielles insensibles à la casse et peut contenir plusieurs termes de recherche (devraient être des espaces blancs et/ou séparés par des virgules). Nous pouvons également restreindre le comportement de recherche en ajoutant divers caractères au champ search_fields.

  • ‘^’ Commence par rechercher.
  • ‘=’ Correspondances exactes.
  • ‘@’ Recherche en texte intégral. (pour le backend PostgreSQL de Django)
  • ‘$’ Recherche d’expression régulière

Par défaut, le paramètre de recherche est nommé recherche, et vous pouvez le remplacer avec le SEARCH_PARAM paramètre. Utilisons la classe SearchFilter en ajoutant le rest_framework.filters.SearchFilter classe à la REST_FRAMEWORK dictionnaire.

Python3

REST_FRAMEWORK = {

    'DEFAULT_FILTER_BACKENDS'🙁

        'django_filters.rest_framework.DjangoFilterBackend',

        'rest_framework.filters.SearchFilter',

    ),

}

Notre classe RobotList ressemble à ceci :

Python3

class RobotList(generics.ListCreateAPIView):

    queryset = Robot.objects.all()

    serializer_class = RobotSerializer

    name = 'robot-list'

     

    search_fields = (

        '^name',

    )

La champs_recherche L’attribut spécifie un tuple de chaînes, qui indique les noms de champ que nous voulons inclure dans la fonction de recherche.

Cherchons les robots, qui commencent par le nom ‘IRB’. La commande HTTPie est

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

Production:

robotsearch

Filtre de commande

La Filtre de commande class vous permet de trier le résultat en fonction des champs spécifiés. Par défaut, le paramètre de requête est nommé commande, et il peut être remplacé par le ORDERING_PARAM paramètre. La champ_de_commande L’attribut spécifie un tuple de chaînes, qui indique les noms de champ pour trier les résultats.

Si vous ne spécifiez pas de champs_de_commande sur la vue, la classe de filtre permet à l’utilisateur de filtrer sur tous les champs lisibles spécifiés par l’attribut serializer_class. Cela permet à l’utilisateur de commander des informations sensibles telles que les champs de hachage de mot de passe, etc., ce qui peut entraîner une fuite de données inattendue. Vous pouvez également spécifier un ordre par défaut en définissant un attribut d’ordre sur la vue. Il peut s’agir d’une chaîne ou d’une liste/tuple de chaînes.

Pour faire usage de Filtre de commande classe, nous devons définir la classe comme classe de filtre de tri par défaut sur la REST_FRAMEWORK dictionnaire.

Python3

REST_FRAMEWORK = {

    'DEFAULT_FILTER_BACKENDS'🙁

        'django_filters.rest_framework.DjangoFilterBackend',

        'rest_framework.filters.OrderingFilter',

    ),

}

Mentionnons l’attribut ordering_fields sur la classe RobotList. Le code comme suit :

Python3

class RobotList(generics.ListCreateAPIView):

    queryset = Robot.objects.all()

    serializer_class = RobotSerializer

    name = 'robot-list'

 

    ordering_fields = (

        'price',

    )

Maintenant, récupérons les robots en fonction de l’augmentation de la commande de prix. La commande HTTPie est

http “:8000/robot/?commande=prix”

Production:

robotorderingprice

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Aller en haut