[PYTHON] [Django Rest Framework] Personnalisez la fonction de filtre à l'aide de Django-Filter

Aperçu

Cet article vous guide à travers les étapes d'un débutant développant un service de livraison de coupons pour l'iPhone avec une API RESTful et rapide. Puisqu'elle a été mise en œuvre en examinant les éléments techniques un par un, c'est une mise en œuvre très détour.

Correspond aux paramètres du champ spécifié à l'aide du filtrage générique dans le précédent Définir le filtre pour qu'il ne réponde qu'à des données spécifiques dans Django Rest Framework. J'ai pu filtrer les données. Cependant, avec cette méthode, il n'est pas possible de filtrer les paramètres spécifiés dans les conditions «supérieur ou égal à» et «inférieur ou égal à».

Par conséquent, cette fois, nous mettrons en œuvre une fonction de filtre qui détermine la date d'expiration en fonction de conditions telles que «avant» et «après» pour la date.

Si vous n'avez pas installé Django-Filter, veuillez l'installer en vous référant à Article précédent.

référence

environnement

Mac OS 10.15 VSCode 1.39.2 pipenv 2018.11.26 Python 3.7.4 Django 2.2.6

procédure

Créez une classe FilterSet dans views.py

Créez un jeu de filtres d'origine en héritant de la classe FilterSet de django_filter. Tout d'abord, ajoutez un processus pour importer la classe FilterSet.


from django_filters import rest_framework as filters

Ensuite, implémentez le jeu de filtres d'origine avant la classe ViewSet.


class CustomFilter(filters.FilterSet):
    #Définition du filtre
    deadline = filters.DateFilter(field_name='deadline', lookup_expr='gte')

    class Meta:
        model = Coupon
        fields = ['deadline'] #Énumérer les filtres définis

La partie suivante est le réglage du filtre. Cette fois, j'utiliserai DateFilter, mais il existe de nombreux autres filtres tels que des filtres de chaînes de caractères et des filtres numériques. Pour plus d'informations, voir Documents officiels!


deadline = filters.DateFilter(field_name='deadline', lookup_expr='gte')

** Supplément ** Le champ field_name = '' ci-dessus spécifie le nom du champ de modèle que vous souhaitez filtrer. Si vous ne spécifiez pas de nom ici, le nom de la définition de filtre (la partie de «date limite» dans le code ci-dessus) sera traité comme le nom du champ de modèle à filtrer.

(Field_name est spécifié dans l'exemple de code, mais il n'est pas réellement nécessaire s'il est identique au nom de la définition de filtre.)

Le nom du paramètre lors d'une demande sera le nom de la définition de filtre. En d'autres termes, ** si vous souhaitez que le nom du paramètre soit différent du nom du champ du modèle lors de la demande, vous devez définir field_name **.

Définissez le nom du modèle des données filtrées dans model = ~ ci-dessous. Fields = [~] liste les noms des définitions de filtre.


    class Meta:
        model = Coupon
        fields = ['deadline']

Ajout du traitement pour appeler FilterSet dans ViewSet existant

Appelez simplement la classe de filtre implémentée ci-dessus comme filter_class.


filter_class = CustomFilter

Essaie

Estimé 5 minutes → 5 minutes

Comparez la différence entre les données qui peuvent être obtenues quand et quand «date limite», qui indique la date d'expiration du coupon, n'est pas spécifiée comme paramètre de demande.

** Si la date limite du paramètre n'est pas spécifiée **

demande

curl -X GET http://127.0.0.1:8000/api/coupons/

réponse

[{"id": 1, "code": "0001", "avantage": "1 000 yens de remise sur le paiement", "explication": "Limité aux clients utilisant 5 000 yens ou plus. Ne peut être utilisé avec d'autres coupons. "," store ":" Tous les magasins "," start ":" 2019-10-01 "," date limite ":" 2019-12-31 "," status ": true}, {" id ": 2," code ":" 0002 "," beneficier ":" 10% sur votre facture! "," Explication ":" Ne peut être combiné avec d'autres coupons "," store ":" Yurakucho store "," start ":" 2019-10 -01 "," date limite ":" 2019-12-31 "," status ": true}, {" id ": 3," code ":" 0003 "," bénéfice ":" [Halloween uniquement] Déguisement 30% de réduction lorsque vous venez au magasin "," explication ":" Uniquement pour les clients qui sont déguisés en 50% ou plus du corps entier (le jugement est le sentiment du personnel). Ne peut être utilisé avec d'autres coupons "," magasin ":" Boutique Kanda "," start ":" 2019-10-31 "," date limite ":" 2019-10-31 "," status ": true}, {" id ": 4," code ":" 0004 ", "avantage": "[septembre uniquement] Service de boulettes d'observation de la lune", "explication": "Donnant une boulette d'observation de la lune aux clients qui le souhaitent! Peut être utilisé en combinaison avec d'autres coupons!", "Magasin": "Tous les magasins" , "start": "2019-09-01", "date limite": "2019-09-30", "status": true}, {"id": 5, "code": "0005", "avantage" : "[Jours de pluie uniquement] 15% de réduction sur le paiement", "explication": "Disponible uniquement lorsque les coupons sont livrés. Ne peut être combiné avec d'autres coupons", "magasin": "Tous les magasins", "démarrer" ":" 01/10/2019 "," date limite ":" 31/12/2019 "," status ": false}, {" id ": 6," code ":" 0006 "," avantage ":" [ Dimanche seulement] Cheers Tequila service "," explication ":" Nous servirons Tequila pour le nombre de personnes. Peut être utilisé avec d'autres coupons. "," Store ":" Kanda store "," start ":" 2019-11-03 " , "ré eadline ":" 01/12/2019 "," status ": true}, {" id ": 7," code ":" 0007 "," beneficier ":" 19% de réduction sur votre facture "," explication ": "Limité du 29 décembre au 31 décembre. Ne peut être utilisé avec d'autres coupons "," store ":" Kanda store "," start ":" 2019-12-29 "," date limite ":" 2019-12-31 "," status ": true}]

** Lors de la spécification de la date limite **

Demande (demande uniquement pour les coupons expirant le 5 décembre ou après)

curl -X GET http://127.0.0.1:8000/api/coupons/?deadline=2019-12-05

réponse

[{"id": 1, "code": "0001", "avantage": "1 000 yens de remise sur le paiement", "explication": "Limité aux clients utilisant 5 000 yens ou plus. Ne peut être utilisé avec d'autres coupons. "," store ":" Tous les magasins "," start ":" 2019-10-01 "," date limite ":" 2019-12-31 "," status ": true}, {" id ": 2," code ":" 0002 "," beneficier ":" 10% sur votre facture! "," Explication ":" Ne peut être combiné avec d'autres coupons "," store ":" Yurakucho store "," start ":" 2019-10 -01 "," date limite ":" 2019-12-31 "," status ": true}, {" id ": 5," code ":" 0005 "," bénéficier ":" [jours de pluie uniquement] 15% de réduction à la caisse "," explication ":" Uniquement disponible lorsque les coupons sont livrés. Ne peut être combiné avec d'autres coupons "," magasin ":" Tous les magasins "," start ":" 2019-10-01 " , "date limite": "2019-12-31", "status": false}, {"id": 7, "code": "0007", "bénéficier": "19% de réduction sur votre facture", "explication" ":" Limité au 29-31 décembre. Ne peut être utilisé avec d'autres coupons "," store ":" Kanda store "," start ":" 2019-12-29 "," date limite ":" 2019 -12-31 "," statut ": vrai}]

Seuls les coupons avec une date d'expiration du 5 décembre ou plus tard peuvent être obtenus.

Ensuite, Implémenter la fonction d'authentification

Recommended Posts

[Django Rest Framework] Personnalisez la fonction de filtre à l'aide de Django-Filter
Comprendre la commodité de Django Rest Framework
Notes diverses sur le framework Django REST
Bases du framework Django REST
Astuces Django Rest Framework
[CRUD] [Django] Créer un site CRUD en utilisant le framework Python Django ~ 1 ~
Essayez de créer une application Todo avec le framework Django REST
Lorsque vous souhaitez filtrer avec le framework Django REST
Implémentez l'API à une vitesse explosive en utilisant Django REST Framework
[CRUD] [Django] Créer un site CRUD en utilisant le framework Python Django ~ 2 ~
[CRUD] [Django] Créer un site CRUD en utilisant le framework Python Django ~ 3 ~
[CRUD] [Django] Créer un site CRUD en utilisant le framework Python Django ~ 4 ~
[CRUD] [Django] Créer un site CRUD en utilisant le framework Python Django ~ 5 ~
Bloc d'achoppement du framework Django REST
Framework Django REST avec Vue.js
Connectez-vous avec Django Rest Framework
Comment écrire une validation personnalisée dans Django REST Framework
Essayez d'utiliser le framework Web Python Django (2) - Regardez setting.py
Comment réinitialiser le mot de passe via l'API à l'aide du framework Rest Django
Création d'une API qui renvoie des résultats d'inférence négatifs-positifs à l'aide de BERT dans le framework Django REST
Implémentation de CRUD à l'aide de l'API REST avec Python + Django Rest framework + igGrid
Précautions lors de l'utilisation de la fonction urllib.parse.quote
Installer le framework Python django à l'aide de pip
[Django] Utiliser MessagePack avec le framework Django REST
Créer une API REST pour faire fonctionner dynamodb avec le Framework Django REST
Essayez d'utiliser le framework web de Python Django (1) - De l'installation au démarrage du serveur
Comment créer une application à partir du cloud à l'aide du framework Web Django
Créer une API RESTful avec Django Rest Framework
Essayez d'utiliser le framework d'application Web Flask
Un outil administratif qui peut être créé immédiatement avec le framework ng-admin + Django REST
CRUD GET avec Nuxt & Django REST Framework ②
CRUD POST avec Nuxt & Django REST Framework
CRUD GET avec Nuxt & Django REST Framework ①
Django REST Framework + Considération de conception d'architecture propre
Solution lorsque Not Found apparaît lors de la frappe de l'API de Django REST Framework de l'extérieur
La fonction _authenticate_with_backend était obsolète dans django auth.autenticate
CRUD PUT, DELETE avec Nuxt & Django REST Framework
Sortie exclusive de l'application Django utilisant ngrok
Essayez d'utiliser le framework Web Python Tornado Partie 1
Framework Django REST Un peu utile à savoir.
Implémenter la fonctionnalité de connexion JWT dans le framework Django REST
Essayez d'utiliser le framework Web Python Tornado Partie 2
J'ai essayé d'utiliser le filtre d'image d'OpenCV
Implémentation de la fonction d'authentification dans Django REST Framework à l'aide de djoser