[PYTHON] [Django Rest Framework] Passen Sie die Filterfunktion mit Django-Filter an

Überblick

Dieser Artikel führt Sie durch die Schritte eines Anfängers, der einen Gutscheinverteilungsdienst für das iPhone mit einer RESTful-API und schnell entwickelt. Da es implementiert wurde, während die technischen Elemente einzeln untersucht wurden, ist es eine sehr Umwegimplementierung.

Entspricht den Parametern des Felds, das mithilfe der generischen Filterung im vorherigen Festlegen, dass der Filter nur auf bestimmte Daten in Django Rest Framework reagiert angegeben wurde. Ich konnte die Daten filtern. Mit dieser Methode ist es jedoch nicht möglich, die angegebenen Parameter unter den Bedingungen "größer oder gleich" und "kleiner als oder gleich" zu filtern.

Daher werden wir dieses Mal eine Filterfunktion implementieren, die das Ablaufdatum basierend auf Bedingungen wie "vor" und "nach" für das Datum bestimmt.

Wenn Django-Filter nicht installiert ist, installieren Sie es bitte unter Bezugnahme auf den vorherigen Artikel.

Referenz

Umgebung

Mac OS 10.15 VSCode 1.39.2 pipenv 2018.11.26 Python 3.7.4 Django 2.2.6

Verfahren

Erstellen Sie eine FilterSet-Klasse in views.py

Erstellen Sie einen ursprünglichen Filtersatz, indem Sie die FilterSet-Klasse von django_filter erben. Fügen Sie zunächst einen Prozess zum Importieren der FilterSet-Klasse hinzu.


from django_filters import rest_framework as filters

Implementieren Sie dann den ursprünglichen Filtersatz vor der ViewSet-Klasse.


class CustomFilter(filters.FilterSet):
    #Filterdefinition
    deadline = filters.DateFilter(field_name='deadline', lookup_expr='gte')

    class Meta:
        model = Coupon
        fields = ['deadline'] #Definieren Sie definierte Filter

Der folgende Teil ist die Filtereinstellung. Dieses Mal werde ich DateFilter verwenden, aber es gibt viele andere Filter wie Zeichenfolgenfilter und numerische Filter. Weitere Informationen finden Sie unter Offizielle Dokumente!


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

** Ergänzung ** Der obige "Feldname =" gibt den Namen des Modellfelds an, das Sie filtern möchten. Wenn Sie hier keinen Namen angeben, wird der Name der Filterdefinition (der Teil von "Frist" im obigen Code) als Name des zu filternden Modellfelds behandelt.

(Feldname wird im Beispielcode angegeben, ist jedoch nicht erforderlich, wenn er mit dem Namen der Filterdefinition identisch ist.)

Der Parametername beim Anfordern ist der Name der Filterdefinition. Mit anderen Worten, ** wenn Sie möchten, dass sich der Parametername beim Anfordern vom Modellfeldnamen unterscheidet, müssen Sie Feldname ** festlegen.

Stellen Sie den Modellnamen der gefilterten Daten in model = ~ unten ein. Fields = [~] listet die Namen der Filterdefinitionen auf.


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

Verarbeitung zum Aufrufen von FilterSet in vorhandenem ViewSet hinzugefügt

Rufen Sie einfach die oben implementierte Filterklasse als filter_class auf.


filter_class = CustomFilter

Ausprobieren

Geschätzte 5 Minuten → 5 Minuten

Vergleichen Sie den Unterschied in den Daten, die abgerufen werden können, wenn und wann "Frist", die das Ablaufdatum des Gutscheins angibt, nicht als Anforderungsparameter angegeben ist.

** Wenn die Parameterfrist nicht angegeben ist **

Anfrage

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

Antwort

[{"id": 1, "code": "0001", "vorteil": "1.000 Yen Rabatt von der Zahlung", "Erklärung": "Beschränkt auf Kunden, die 5.000 Yen oder mehr verwenden. Kann nicht mit anderen Gutscheinen verwendet werden. "," store ":" Alle Geschäfte "," start ":" 2019-10-01 "," Deadline ":" 2019-12-31 "," status ": true}, {" id ": 2," code ":" 0002 "," Vorteil ":" 10% Rabatt auf Ihre Rechnung! "," Erklärung ":" Kann nicht mit anderen Gutscheinen kombiniert werden "," Geschäft ":" Yurakucho Geschäft "," Start ":" 2019-10 -01 "," Deadline ":" 2019-12-31 "," Status ": true}, {" id ": 3," Code ":" 0003 "," Benefit ":" [nur Halloween] Verkleidung 30% Rabatt, wenn Sie in den Laden kommen "," Erklärung ":" Nur für Kunden, die als 50% oder mehr des gesamten Körpers verkleidet sind (Beurteilung ist das Gefühl des Personals). Kann nicht mit anderen Gutscheinen verwendet werden "," Laden ":" Kanda Store "," Start ":" 2019-10-31 "," Deadline ":" 2019-10-31 "," Status ": true}, {" ID ": 4," Code ":" 0004 ", "Vorteil": "[nur September] Mondbeobachtungsknödelservice", "Erklärung": "Kunden, die einen Mondbeobachtungsknödel wünschen! Kann in Kombination mit anderen Gutscheinen verwendet werden!", "Geschäft": "Alle Geschäfte" , "Start": "2019-09-01", "Frist": "2019-09-30", "Status": true}, {"id": 5, "Code": "0005", "Vorteil" : "[Nur Regentage] 15% Rabatt auf die Zahlung", "Erklärung": "Nur verfügbar, wenn Gutscheine geliefert werden. Kann nicht mit anderen Gutscheinen kombiniert werden", "Geschäft": "Alle Geschäfte", "Start" ":" 2019-10-01 "," Frist ":" 2019-12-31 "," Status ": false}, {" id ": 6," Code ":" 0006 "," Benefit ":" [ Nur Sonntag] Cheers Tequila Service "," Erklärung ":" Wir werden Tequila für die Anzahl der Personen servieren. Kann mit anderen Gutscheinen verwendet werden. "," Store ":" Kanda Store "," Start ":" 2019-11-03 " "d eadline ":" 2019-12-01 "," status ": true}, {" id ": 7," code ":" 0007 "," Benefit ":" 19% Rabatt von Ihrer Rechnung "," Erklärung ": "Vom 29. bis 31. Dezember begrenzt. Kann nicht mit anderen Gutscheinen verwendet werden "," store ":" Kanda store "," start ":" 2019-12-29 "," Deadline ":" 2019-12-31 "," status ": true}]

** Bei Angabe der Frist **

Anfrage (Anfrage nur für Gutscheine, die am oder nach dem 5. Dezember ablaufen)

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

Antwort

[{"id": 1, "code": "0001", "vorteil": "1.000 Yen Rabatt von der Zahlung", "Erklärung": "Beschränkt auf Kunden, die 5.000 Yen oder mehr verwenden. Kann nicht mit anderen Gutscheinen verwendet werden. "," store ":" Alle Geschäfte "," start ":" 2019-10-01 "," Deadline ":" 2019-12-31 "," status ": true}, {" id ": 2," code ":" 0002 "," Vorteil ":" 10% Rabatt auf Ihre Rechnung! "," Erklärung ":" Kann nicht mit anderen Gutscheinen kombiniert werden "," Geschäft ":" Yurakucho Geschäft "," Start ":" 2019-10 -01 "," Deadline ":" 2019-12-31 "," Status ": true}, {" id ": 5," Code ":" 0005 "," Benefit ":" [Nur Regentage] 15% Rabatt von der Kasse "," Erklärung ":" Nur verfügbar, wenn Gutscheine geliefert werden. Kann nicht mit anderen Gutscheinen kombiniert werden "," Geschäft ":" Alle Geschäfte "," Start ":" 2019-10-01 " , "Frist": "31.12.2019", "Status": false}, {"id": 7, "Code": "0007", "Vorteil": "19% Rabatt von Ihrer Rechnung", "Erklärung" ":" Begrenzt vom 29. bis 31. Dezember. Kann nicht mit anderen Gutscheinen verwendet werden "," Geschäft ":" Kanda-Geschäft "," Start ":" 2019-12-29 "," Frist ":" 2019 -12-31 "," status ": true}]

Ich konnte nur die Gutscheine erhalten, deren Ablaufdatum nach dem 5. Dezember liegt.

Weiter Authentifizierungsfunktion implementieren

Recommended Posts

[Django Rest Framework] Passen Sie die Filterfunktion mit Django-Filter an
Verstehen Sie den Komfort des Django Rest Framework
Verschiedene Hinweise zum Django REST-Framework
Grundlagen des Django REST-Frameworks
Tipps zum Django Rest Framework
[CRUD] [Django] Erstellen Sie eine CRUD-Site mit dem Python-Framework Django ~ 1 ~
Lassen Sie uns eine Todo-App mit dem Django REST-Framework erstellen
Wenn Sie mit dem Django REST-Framework filtern möchten
Implementieren Sie die API mit explosiver Geschwindigkeit mithilfe des Django REST Framework
[CRUD] [Django] Erstellen Sie eine CRUD-Site mit dem Python-Framework Django ~ 2 ~
[CRUD] [Django] Erstellen Sie eine CRUD-Site mit dem Python-Framework Django ~ 3 ~
[CRUD] [Django] Erstellen Sie eine CRUD-Site mit dem Python-Framework Django ~ 4 ~
[CRUD] [Django] Erstellen Sie eine CRUD-Site mit dem Python-Framework Django ~ 5 ~
Django REST Framework Stolperstein
Django REST Framework mit Vue.js
Melden Sie sich mit dem Django Rest Framework an
So schreiben Sie eine benutzerdefinierte Validierung in Django REST Framework
Versuchen Sie es mit dem Python-Webframework Django (2). Schauen Sie sich settings.py an
Zurücksetzen des Passworts über die API mit dem Django Rest Framework
Erstellen einer API, die mit BERT im Django REST-Framework negativ-positive Inferenzergebnisse zurückgibt
Implementierung von CRUD mithilfe der REST-API mit Python + Django Rest Framework + igGrid
Vorsichtsmaßnahmen bei Verwendung der Funktion urllib.parse.quote
Installieren Sie das Python Framework Django mit pip
[Django] Verwenden Sie MessagePack mit dem Django REST-Framework
Erstellen Sie eine REST-API, um dynamodb mit dem Django REST Framework zu betreiben
Versuchen Sie es mit Pythons Webframework Django (1) - Von der Installation bis zum Serverstart
So erstellen Sie eine Anwendung aus der Cloud mithilfe des Django-Webframeworks
Erstellen Sie eine RESTful-API mit dem Django Rest Framework
Versuchen Sie es mit dem Webanwendungsframework Flask
Ein Verwaltungstool, das sofort mit dem REST-Framework ng-admin + Django erstellt werden kann
CRUD GET mit Nuxt & Django REST Framework ②
CRUD POST mit Nuxt & Django REST Framework
CRUD GET mit Nuxt & Django REST Framework ①
Überlegungen zum Design von Django REST Framework + Clean Architecture
Lösung, wenn nicht gefunden, wird angezeigt, wenn die API von Django REST Framework von außen aufgerufen wird
Die Funktion _authenticate_with_backend wurde in django auth.autenticate nicht mehr unterstützt
CRUD PUT, DELETE mit Nuxt & Django REST Framework
Exklusive Veröffentlichung der Django App mit ngrok
Versuchen Sie es mit dem Python-Webframework Tornado Part 1
Django REST Framework Ein wenig nützlich zu wissen.
Implementieren Sie die JWT-Anmeldefunktion im Django REST-Framework
Versuchen Sie es mit dem Python-Webframework Tornado Part 2
Ich habe versucht, den Bildfilter von OpenCV zu verwenden
Implementierung der Authentifizierungsfunktion in Django REST Framework mit djoser