Django ArrayField
-
Verwenden Sie
ArrayField
, um ein eindimensionales Array in Django-Modellen hinzuzufügen -
Verwenden Sie
ArrayField
, um ein mehrdimensionales Array in Django-Modellen zu erstellen
Das ArrayField
in Django ähnelt einer Array-Datenstruktur in anderen Programmiersprachen wie Java, C, C++ usw. Es speichert mehrere Werte desselben Datentyps.
Bevor wir mit dem Arrayfield
in Django fortfahren, sollte der Benutzer bestätigen, dass er PostgreSQL
als Datenbank verwendet, da die SQLite
-Datenbank Arrayfield
nicht unterstützt.
Um die Datenbank PostgreSQL
einzurichten, sollten Benutzer den Server von PostgreSQL
lokal ausführen. Um es danach mit Django zu verbinden, müssen Benutzer in der Datei settings.py
der Anwendung das Array DATABASES
ändern, wie unten gezeigt.
DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql",
"NAME": "<DATABASES_name>",
"USER": "<USER_name>",
"PASSWORD": "<PASSWORD_of_user>",
"HOST": "localhost",
"PORT": "5432",
}
}
In der folgenden Abbildung können Benutzer sehen, wie wir PostgreSQL
in der Datei settings.py
eingerichtet haben.
Verwenden Sie ArrayField
, um ein eindimensionales Array in Django-Modellen hinzuzufügen
In diesem Abschnitt werden wir das ArrayField
verwenden, um dem Django-Modell ein Array von Werten hinzuzufügen. Das folgende Beispiel zeigt die Verwendung von ArrayField
, um das Array von TextField
zu erstellen.
from django.db import models
from django.contrib.postgres.fields import ArrayField
class ResearchPaper(models.Model):
paperName = models.CharField(max_length=200)
author = ArrayField(models.CharField(max_length=200), blank=True)
def __str__(self):
return self.paperName
Wir haben das Django-Modell für das ResearchPaper
im obigen Python-Code erstellt. Es enthält die Felder paperName
und Authors
.
Das Feld paperName
ist das normale Zeichenfeld, aber es kann mehrere Autoren für eine einzelne Arbeit geben, daher haben wir das ArrayField
verwendet, um das Feld Authors
zu erstellen.
Sobald wir das Modell in der Datei models.py
hinzugefügt haben, müssen wir das Modell registrieren. Um das Modell zu registrieren, erstellen Sie admin.py
, falls es nicht existiert, und fügen Sie den folgenden Code zur Datei hinzu.
from .models import ResearchPaper
admin.site.register(ResearchPaper)
Nach der Registrierung des Modells müssen Benutzer das Modell in die Datenbank migrieren. Dazu müssen Benutzer den folgenden Befehl nacheinander im Terminal ausführen.
python manage.py makemigrations <app_name>
python manage.py migrate
Nun lernen wir, die Daten aus dem ArrayField
nach ihrem Wert abzufragen.
Bevor wir mit der Abfrage der Daten aus der Tabelle ResearchPaper
beginnen, fügen wir einige Daten hinzu.
ResearchPaper.objects.create(paperName="First paper", author=["Alice", "Bob", "jenny"])
ResearchPaper.objects.create(paperName="Second paper", author=["Alice"])
ResearchPaper.objects.create(paperName="Third paper", author=["Bob"])
ResearchPaper.objects.create(paperName="Fourth paper", author=["Alice", "Bob"])
ResearchPaper.objects.create(paperName="Fifth paper", author=["Bob", "jenny"])
Daher haben wir einige Aufzeichnungen von Forschungsarbeiten mit verschiedenen Autoren hinzugefügt. Außerdem haben einige Artikel mehrere Autoren, und ein einzelner Autor hat mehrere Artikel geschrieben.
Im folgenden gif
können wir sehen, dass Daten zur Datenbank hinzugefügt werden.
Verwenden Sie die enthält
-Suche
Die contains
-Suche gibt alle Datensätze zurück, deren Lookup-Werte eine Teilmenge der ArrayField
-Daten sind.
Beispielcode:
ResearchPaper.objects.filter(
author__contains=["Alice"]
) # returns <QuerySet [<ResearchPaper: First paper>, <ResearchPaper: Second paper>, <ResearchPaper: Fourth paper>]>
ResearchPaper.objects.filter(
author__contains=["Alice", "Bob"]
) # returns <QuerySet [<ResearchPaper: First paper>, <ResearchPaper: Fourth paper>
Ausgang:
Verwenden Sie die contained_by
-Suche
Die contained_by
-Suche ist die Umkehrung der contains
-Suche. Es gibt alle Datensätze zurück, deren Daten eine Teilmenge von Nachschlagewerten sind.
Beispielcode:
ResearchPaper.objects.filter(
author__contained_by=["Alice"]
) # returns <QuerySet [<ResearchPaper: Second paper>]>
ResearchPaper.objects.filter(
author__contained_by=["Alice", "Bob"]
) # returns <QuerySet [<ResearchPaper: Second paper>, <ResearchPaper: Third paper>, <ResearchPaper: Fourth paper>]>
Ausgang:
Verwenden Sie die Überlappungs
-Suche
Die Suche nach Überlappung
gibt alle Datensätze zurück, deren Daten einzelne oder mehrere Suchwerte enthalten.
Beispielcode:
ResearchPaper.objects.filter(
author__overlap=["Alice"]
) # returns <QuerySet [<ResearchPaper: Second paper>, <ResearchPaper: Fourth paper>]>
ResearchPaper.objects.filter(
author__overlap=["Alice", "jenny"]
) # returns <QuerySet [<ResearchPaper: Second paper>, <ResearchPaper: Fourth paper>, <ResearchPaper: Fifth paper>]>
Ausgang:
Verwenden Sie die len
-Suche
Die len
-Suche überprüft die Länge der Daten und gibt alle Datensätze zurück, deren Länge dem Wert der len
-Suche entspricht.
Beispielcode:
ResearchPaper.objects.filter(
author__len=1
) # returns <QuerySet [<ResearchPaper: Second paper>, <ResearchPaper: Third paper>]>
ResearchPaper.objects.filter(
author__len=3
) # returns <QuerySet [<ResearchPaper: First paper>]>
Ausgang:
Auf diese Weise können wir verschiedene Lookups verwenden, um die Datensätze nach ArrayField
-Werten abzufragen.
Verwenden Sie ArrayField
, um ein mehrdimensionales Array in Django-Modellen zu erstellen
Benutzer müssen möglicherweise zweidimensionale Arrays in den Django-Modellen erstellen, und Benutzer können dies mit dem ArrayField
erreichen. Hier haben wir den grundlegenden Code geschrieben, um ein zweidimensionales Array in Django zu erstellen.
from django.db import models
from django.contrib.postgres.fields import ArrayField
class ResearchPaper(models.Model):
paperName = models.TextField()
Authors = ArrayField(
ArrayField(
models.TextField(blank=True),
)
)
In diesem Artikel haben wir gelernt, ein- und mehrdimensionale Arrays in Django-Feldern zu erstellen. Außerdem haben wir gelernt, die verschiedenen Lookups zu verwenden, um die Datensätze nach Werten von ArrayField
abzufragen.
Benutzer können die Datensätze für das zweidimensionale Array wie ein eindimensionales Array abfragen.