Dieser Artikel führt Sie durch die Schritte eines Anfängers, der einen Gutscheinverteilungsdienst für das iPhone mit RESTful API und Swift entwickelt hat. Da es implementiert wurde, während die technischen Elemente einzeln untersucht wurden, ist es eine sehr Umwegimplementierung.
Bis zu den vorherigen Anzeigen von Daten, die von der API in TableView of Swift erfasst wurden, der Web-API, die Couponinformationen liefert, und dem Coupon, der diese Web-API verwendet Die dem Benutzer zu liefernde iPhone-App wurde auf dem erforderlichen Mindestniveau "Super" fertiggestellt. Von hier aus werden wir die Implementierungsmethode, Funktionen und Benutzeroberfläche der Web-API und der Apps verbessern.
Dieses Mal werden wir die Hardcodierung der Coupondaten so ändern, dass sie in der Datenbank verwaltet werden. Die API-Anforderungs- und Antwortspezifikationen werden entsprechend neu angeordnet. Die Datenbank verwendet SQLite, das von Anfang an in Python integriert ist.
Mac OS 10.15 VSCode 1.39.2 pipenv 2018.11.26 Python 3.7.4 Django 2.2.6
Da Sie entscheiden müssen, welche Daten in der Datenbank verwaltet werden sollen, berücksichtigen Sie die API-Anforderungs- und Antwortspezifikationen. Die Couponverteilungs-API für das Thema enthält die folgenden Spezifikationen.
** Parameter anfordern **
Antwort
Der Tabellenname sollte "Coupon" sein.
Wenn Sie ein verfügbares Geschäft mit dem Anforderungsparameter erhalten, wird nur der Gutschein zurückgegeben, der im angegebenen Geschäft verwendet werden kann. Wenn der Anforderungsparameter leer ist, werden alle derzeit verfügbaren Gutscheine zurückgegeben.
Die Definitionen der verfügbaren Gutscheine lauten wie folgt.
Die Datenbankeinstellungen werden in settings.py
im Verzeichnis des Projektnamens beschrieben ( / ami_coupon_api
im Beispiel dieses Artikels).
Wie im Screenshot gezeigt, werden die Einstellungen grundsätzlich bei Verwendung von SQLite von Anfang an vorgenommen, sodass bei Verwendung von SQLite keine Bearbeitung erforderlich ist. Nur für den Fall, ich habe nur überprüft, ob es von der ursprünglichen Einstellung geändert wurde.
Standardmäßig wird db.sqlite3 beim Erstellen des Projekts generiert.
Zusätzlich zu SQLite unterstützt Django MySQL und PostgreSQL.
Django erstellt die Datenbank und die Tabelle automatisch basierend auf dem Modell, sodass Sie die Tabelle nicht selbst erstellen müssen. Erstellen Sie das Originalmodell. Das Modell (Modellklasse) ist 1: 1 mit der Tabelle verknüpft, und das Modellfeld und die Tabellenelemente (Instanzen) sind ebenfalls 1: 1 verknüpft, sodass das Bild einfach ist.
Dieses Mal benötigen wir eine Coupon-Tabelle, um Coupon-Informationen zu speichern. Öffnen Sie also models.py
im Anwendungsverzeichnis ( / coupon
im Beispiel dieses Artikels) und erstellen Sie dort eine Coupon-Klasse.
Das Modell ist wie folgt definiert.
[Modellfeldname] = Modelle. [Datentyp]
Hier ist das Modell, das ich erstellt habe.
models.py
from django.db mport models
class Coupon(models.Model):
code = models.CharField(max_length=20) #Gutscheincode
benefit = models.CharField(max_length=1000) #Coupon Vorteile
explanation = models.CharField(max_length=2000) #Kommentar
store = models.CharField(max_length=1000) #Verfügbare Geschäfte
start = models.DateField() #Anfangsdatum
deadline = models.DateField() #Haltbarkeitsdatum
status = models.BooleanField() #Status (verfügbar)/Unmögliche Flagge)
def __str__(self):
return '<Coupon:id=' + str(self.id) + ',' + self.code + ',' + self.benefit + '>'
Der def __str__ (self): ~
Teil des obigen Codes ist die ** Definition der Anzeigeregeln **, wenn Sie mit einem Browser auf den Django-Server zugreifen und die gespeicherten Daten anzeigen. Es funktioniert als Modell, auch wenn es keine Beschreibung gibt, aber ich denke, es ist besser, es für eine einfache Verwaltung zu definieren.
Im Fall des folgenden Codes werden beim Zugriff auf den Verwaltungsbildschirm mit einem Browser die IDs, Codes und Vorteile der einzelnen Coupondaten angezeigt. id
scheint automatisch generiert zu werden, wenn Sie den Primärschlüssel nicht festlegen.
def __str__(self):
return '<Coupon:id=' + str(self.id) + ',' + self.code + ',' + self.benefit + '>'
Geben Sie im Terminal die pipenv-Shell ein und wechseln Sie in das Projektverzeichnis (das Verzeichnis, in dem sich manage.py befindet). Führen Sie dann den Befehl aus, um die Migrationsdatei zu erstellen.
$ python manage.py makemigrations [Anwendungsname (Gutschein im Beispiel dieses Artikels)]
Die Migrationsdatei wurde erstellt.
Führen Sie dann die Migration aus.
$ python manage.py migrate
Die Migration war erfolgreich und wahrscheinlich wurde eine Coupontabelle in SQLite erstellt.
Verwenden Sie standardmäßig das von django bereitgestellte Datenbankverwaltungstool, überprüfen Sie die wahrscheinlich erstellte Coupontabelle und geben Sie die Demodaten des Coupons ein. Da das Verwaltungstool eine Webanwendung ist, die auf dem Django-Server ausgeführt wird, müssen Sie den Django-Server starten, wenn Sie das Tool verwenden.
Bevor Sie sich bei den Verwaltungstools anmelden können, müssen Sie den Administrator mithilfe von Befehlen registrieren. Die folgenden 4 Elemente müssen eingestellt werden. Wenn Sie einen Befehl eingeben, werden Sie nacheinander dazu aufgefordert.
$ python manage.py createsuperuser
Registrieren Sie anschließend das Coupon-Modell, damit es vom Verwaltungstool verwaltet werden kann. Die Registrierung erfolgt in admin.py
im Verzeichnis der Anwendung (Coupon im Beispiel dieses Artikels). Ändern Sie admin.py
wie folgt.
models.py
.admin.site.register
auf und geben Sie den Modellnamen im Argument von an.admin.py
from django.contrib import admin
from .models import Coupon #hinzufügen
# Register your models here.
admin.site.register(Coupon) #hinzufügen
Starten Sie den Django-Server und greifen Sie auf "http: //10.0.0.127: 8000 / admin" zu, um den Anmeldebildschirm des Admin-Tools zu öffnen.
Wenn Sie sich als zuvor erstellter Administrator anmelden, werden die verfügbaren Tabellen (Modelle) angezeigt. (Die von der Coupon-Anwendung erstellte Coupon-Tabelle wird unten angezeigt. Sie wird als Coupons angezeigt, Sie müssen sich jedoch keine Sorgen machen, da das "s" vom Management-Tool ohne Erlaubnis angezeigt wird.)
Wenn Sie die Coupon-Tabelle auswählen, können Sie den Inhalt der Tabelle überprüfen. Da die Daten im Ausgangszustand leer sind, wird nichts angezeigt.
Drücken Sie die Taste ** "ADD COUPON +" ** oben rechts, um zur Dateneingabe zu gelangen. Hier werden alle im Modell definierten Modellfelder angezeigt, sodass Sie problemlos bestätigen können, dass die Tabelle erstellt wurde.
Geben Sie die Daten ein und drücken Sie die Taste ** "SAVE" ** unten rechts, um die Daten zu registrieren.
Ich denke, dass eine intuitive Bedienung möglich ist. Fügen Sie auf die gleiche Weise 5 Coupondaten ein. Die verfügbaren Geschäfte, das Startdatum, das Enddatum und der Status wurden mit Variationen hinzugefügt, damit sie später getestet werden können.
In der Listenanzeige werden die Daten in jeder Zeile in dem Format angezeigt, das durch "str (self)" der Couponklasse "models.py" definiert ist.
Ändern Sie views.py
, um die Informationen eines der in SQLite registrierten Coupons so zu ändern, dass er im JSON-Format antwortet.
Importieren Sie zunächst die Coupon-Klasse von models.py
in views.py
. Fügen Sie from .models import Coupon
zu views.py
hinzu.
Definieren Sie als Nächstes die Antwortverarbeitung für die Anforderung. Fügen Sie hier den Prozess hinzu, um alle Daten der Coupon-Tabelle abzurufen.
data = Coupon.object.all()
Erstellen Sie als Nächstes Daten vom Typ Wörterbuch für Json.dump
.
Die Daten, die mit'Coupon.object.all () 'abgerufen werden können, sind ein Array vom Datentyp, und jedes Array enthält einen Datensatz in einer Zeile der Tabelle. Geben Sie zum Abrufen einer einzelnen Datensatzzeile das [x] -te eines Arrays von Datentypvariablen an. Verwenden Sie zum Abrufen eines Elements in einem Datensatz "data [x] gefolgt von. [Spaltenname des Elements, das Sie abrufen möchten]".
Da json.dumps
den Datentyp nicht so akzeptiert, wie er ist, wandeln Sie ihn in den String-Typ um.
Ich habe einen Prozess geschrieben, um die Couponinformationen des ersten Datensatzes in ein Wörterbuch zu formatieren, indem ich den 0. des Arrays angegeben habe.
params = {
'coupon_code':str(data[0].code),
'coupon_benefits':str(data[0].benefit),
'coupon_explanation':str(data[0].explanation),
'coupon_store':str(data[0].store),
'coupon_start':str(data[0].start),
'coupon_deadline':str(data[0].deadline),
'coupon_status':str(data[0].status),
}
Der Vorgang von json.dumps
ist der gleiche wie vor der Änderung. Die modifizierte views.py
lautet wie folgt.
views.py
from django.shortcuts import render
from django.http import HttpResponse
from .models import Coupon #Coupon-Klasse importieren
import json
def coupon(request):
data = Coupon.objects.all() #Holen Sie sich alle Datensätze in die Tabelle
params = {
'coupon_code':str(data[0].code), #Da jeder Datensatz vom Typ Daten ist, wandeln Sie ihn in den Typ String um
'coupon_benefits':str(data[0].benefit),
'coupon_explanation':str(data[0].explanation),
'coupon_store':str(data[0].store),
'coupon_start':str(data[0].start),
'coupon_deadline':str(data[0].deadline),
'coupon_status':str(data[0].status),
}
json_str = json.dumps(params, ensure_ascii=False, indent=2)
return HttpResponse(json_str)
Wenn Sie die Anforderungs-URL im Browser eingeben und prüfen, ob json geantwortet hat, werden die Informationen eines Gutscheins von json beantwortet.
Was wir mit der API realisieren möchten, ist ** eine Spezifikation, die auf alle Coupons reagiert, die die in den Anforderungsparametern empfangenen Bedingungen erfüllen **. Daher werden wir sie zuerst so ändern, dass mehrere Couponinformationen mit json beantwortet werden können.
Um mit json auf mehrere Datensätze zu antworten, speichern Sie die Informationen eines Datensatzes im Wörterbuchtyp in einem Array und übergeben Sie sie an "json.dumps".
Bereiten Sie zunächst ein Array vor, um mehrere Datensätze als Wörterbuchtyp zu speichern. Der Array-Name lautet "Coupons".
Fügen Sie als Nächstes eine for-Anweisung hinzu, damit der Vorgang zum Erstellen von Datensätzen zu einem Wörterbuchtyp für die Anzahl der Datensätze wiederholt wird.
Auf "für Datensatz in Daten" setzen, damit in jeder Runde eine Datensatzzeile in der Variablen (Datensatz) des Wörterbuchtyps gespeichert wird. Dieser Prozess ist ferner in einer for-Anweisung enthalten, sodass die in einen Wörterbuchtyp konvertierten Couponinformationen im Coupons-Array gespeichert werden, ein Datensatz pro Runde.
Ändern Sie abschließend den übergebenen Wörterbuchtyp in "json.dumps", um die Array-Coupons zu übergeben, die mehrere Wörterbuchtypen enthalten. Die modifizierte views.py
ist hier.
views.py
from django.shortcuts import render
from django.http import HttpResponse
from .models import Coupon #Coupon-Klasse importieren
import json
def coupon(request):
data = Coupon.objects.all() #Holen Sie sich alle Datensätze in die Tabelle
coupons = [] #Bereiten Sie ein Array vor, um mehrere Datensätze als Wörterbuchtyp zu speichern
for record in data: #Konvertieren Sie Datensatz für Datensatz mit for-Anweisung in Wörterbuchtyp
params = {
'coupon_code':str(record.code), #Da jeder Datensatz vom Typ Daten ist, wandeln Sie ihn in den Typ String um
'coupon_benefits':str(record.benefit),
'coupon_explanation':str(record.explanation),
'coupon_store':str(record.store),
'coupon_start':str(record.start),
'coupon_deadline':str(record.deadline),
'coupon_status':str(record.status),
}
coupons.append(params) #Speichern Sie Datensätze vom Typ Wörterbuch in einem Array
json_str = json.dumps(coupons, ensure_ascii=False, indent=2) #Übergeben Sie ein Array mit mehreren lexikalischen Datensätzen
return HttpResponse(json_str)
Wenn Sie eine Anfrage stellen, ohne den Anforderungsparameter im Browser anzugeben, werden alle Gutscheininformationen von Json beantwortet.
Verwenden Sie "Coupon.object.filter ([bedingter Ausdruck])", um Datensätze abzurufen, die bestimmte Kriterien erfüllen.
Da der Anforderungsparameter ein verfügbares Geschäft ist (Artikel, der mit dem Geschäft in der Coupon-Tabelle verknüpft ist), verwenden Sie die Anweisung "if else". Wenn ein Parameter vorhanden ist, verwenden Sie "Coupon.objects.filter", um einen Gutschein zu erhalten, der im angegebenen Geschäft und in allen Geschäften verwendet werden kann. Wenn jedoch keine Parameter vorhanden sind, können Sie alle Gutscheine mit "Coupon.objects.all" abrufen.
Der bedingte Ausdruck ist ** Coupon-Tabelle verfügbare Geschäfte sind die gleichen wie das angeforderte Geschäft ODER alle verfügbaren Geschäfte ** Es wird sein.
Ausdrücke mit mehreren Bedingungen sind mit Q-Objekten einfacher zu schreiben. Importieren Sie das Q-Objekt daher in 'views.py'.
from django.db.models import Q
Als nächstes von den bisher erstellten Programmen
data = Coupon.objects.all() #Holen Sie sich alle Datensätze in die Tabelle`
Fügen Sie dem Teil von einen bedingten Zweig hinzu und gehen Sie wie folgt vor. Wie oben erwähnt, habe ich unter Verwendung des Q-Objekts den bedingten Ausdruck der ODER-Bedingung von ** demselben Coupon wie das anfordernde Geschäft ** und ** dem Gutschein für alle Geschäfte ** festgelegt.
if 'coupon_store' in request.GET:
coupon_store = request.GET['coupon_store']
data = Coupon.objects.filter(Q(store=coupon_store) | Q(store='Alle Geschäfte'))
else:
data = Coupon.objects.all()
Informationen zur Beschreibungsmethode für mehrere Bedingungen mit dem Q-Objekt
ODER suchen
Q(store=coupon_store) | Q(store='Alle Geschäfte')
UND suchen
Q(store=coupon_store) , Q(store='Alle Geschäfte')
Es wird sein.
Wenn Sie dies beantragen, indem Sie den Kanda-Store im Browser als Testversion angeben, werden die Gutscheininformationen des Kanda-Stores und aller Stores angezeigt.
Fügen Sie basierend auf dem bisher implementierten Programm Suchbedingungen hinzu, damit nur Gutscheine beantwortet werden, die das Ablaufdatum nicht überschritten haben und den Status "verfügbar" ** haben.
In Bezug auf das Startdatum der Nutzung haben wir beschlossen, es nicht zu den Suchbedingungen hinzuzufügen, da Gutscheine als Benachrichtigung geliefert werden müssen.
Die Elemente in den Modellfeldern der Coupon-Tabelle, die mit dem Ablaufdatum und dem Status verknüpft sind, lauten wie folgt.
Ablaufdatum: Frist
Status: Status
Vergleichen Sie zunächst das Datum (Datum) der Anfrage mit dem Ablaufdatum des Gutscheins und ändern Sie es so, dass nur diejenigen aus der Gutscheintabelle abgerufen werden, die das Ablaufdatum nicht überschritten haben.
Importieren Sie datetime
in views.py
, damit Sie die Daten abrufen können.
import datetime #Importieren Sie Datum und Uhrzeit, damit Sie Datum und Uhrzeit abrufen können
Fügen Sie den Prozess hinzu, um das Datum in der Gutscheinfunktion abzurufen.
today = datetime.date.today()
** Fügen Sie die Abfrage "Q (Deadline__gte = heute)" zu "Coupon.object.filter" hinzu, um festzustellen, ob der Coupon nach dem oben angegebenen Datum abläuft **.
if 'coupon_store' in request.GET: #Verarbeitung, wenn im Anforderungsparameter ein Speicher angegeben ist
coupon_store = request.GET['coupon_store']
data = Coupon.objects.filter(Q(deadline__gte=today),Q(store=coupon_store) | Q(store='Alle Geschäfte')) # リクエストされた店舗とAlle Geschäfteで使えるクーポンを取得
else: #Gibt alle Gutscheine zurück, wenn keine Anforderungsparameter vorhanden sind
data = Coupon.objects.filter(Q(deadline__gte=today))
Damit haben wir den Prozess der Beantwortung von Elementen abgeschlossen, die nicht abgelaufen sind. Wenn Sie eine Anfrage ohne die Anforderungsparameter stellen, wird der abgelaufene Gutschein (0004) nicht beantwortet.
Fügen Sie dann eine "Q (status = True)" - Abfrage zu "Coupon.object.filter" hinzu, sodass nur Coupons mit dem verfügbaren Status (True) aus der Coupon-Tabelle abgerufen werden.
if 'coupon_store' in request.GET: #Verarbeitung, wenn im Anforderungsparameter ein Speicher angegeben ist
coupon_store = request.GET['coupon_store']
data = Coupon.objects.filter(Q(deadline__gte=today),Q(status=True),Q(store=coupon_store) | Q(store='Alle Geschäfte')) # リクエストされた店舗とAlle Geschäfteで使えるクーポンを取得
else: #Gibt alle Gutscheine zurück, wenn keine Anforderungsparameter vorhanden sind
data = Coupon.objects.filter(Q(deadline__gte=today),Q(status=True))
Wenn ich eine Anfrage stelle, enthält die Antwort keine Gutscheine mit dem Status "Falsch" mehr.
das ist alles.
Führen Sie als Nächstes [Änderung auf der iOS-App-Seite, um diese API anzufordern] aus (https://qiita.com/Ajyarimochi/items/50cdc57f898b79cfb48e).
Recommended Posts