Django
ArrayField - ein PostgreSQL-spezifisches Feld
Suche…
Syntax
- von django.contrib.postgres.fields importieren Sie ArrayField
- Klasse ArrayField (Basisfeld, Größe = Keine, ** Optionen)
- FooModel.objects.filter (array_field_name__contains = [Objekte, to, check])
- FooModel.objects.filter (array_field_name__contained_by = [Objekte, to, check])
Bemerkungen
Beachten Sie, dass der Parameter size
an PostgreSQL übergeben wird, erzwungen wird.
Wenn Sie ArrayField
sollten Sie diese Warnung aus der Dokumentation der Postgresql-Arrays berücksichtigen.
Tipp: Arrays sind keine Sets. Die Suche nach bestimmten Array-Elementen kann ein Zeichen für falsches Datenbankdesign sein. Erwägen Sie die Verwendung einer separaten Tabelle mit einer Zeile für jedes Element, das ein Array-Element sein würde. Dies ist einfacher zu suchen und wird wahrscheinlich für eine große Anzahl von Elementen besser skaliert.
Ein grundlegendes ArrayField
Um ein PostgreSQL ArrayField zu erstellen, sollten Sie ArrayField den Datentyp angeben, den es als erstes Argument als Feld speichern soll. Da wir FloatField
speichern werden, verwenden wir FloatField
.
from django.db import models, FloatField
from django.contrib.postgres.fields import ArrayField
class Book(models.Model):
ratings = ArrayField(FloatField())
Angeben der maximalen Größe eines ArrayFields
from django.db import models, IntegerField
from django.contrib.postgres.fields import ArrayField
class IceCream(models.Model):
scoops = ArrayField(IntegerField() # we'll use numbers to ID the scoops
, size=6) # our parlor only lets you have 6 scoops
Wenn Sie den Größenparameter verwenden, wird er an postgresql übergeben, der ihn akzeptiert und dann ignoriert! Daher ist es durchaus möglich, über die postgresql-Konsole 7 Integer-Werte zum obigen scoops
Feld hinzuzufügen.
Abfrage der Mitgliedschaft von ArrayField mit enthält
Diese Abfrage gibt alle Zapfen mit einer Schokoladenschaufel und einer Vanilleschaufel zurück.
VANILLA, CHOCOLATE, MINT, STRAWBERRY = 1, 2, 3, 4 # constants for flavors
choco_vanilla_cones = IceCream.objects.filter(scoops__contains=[CHOCOLATE, VANILLA])
Vergessen Sie nicht, das IceCream
Modell aus Ihrer models.py
Datei zu importieren.
Denken Sie auch daran, dass Django keinen Index für ArrayField
. Wenn Sie sie durchsuchen möchten, benötigen Sie einen Index, der manuell mit einem Aufruf von RunSQL in Ihrer Migrationsdatei erstellt werden muss.
Verschachtelung von ArrayFields
Sie können ArrayField
ArrayField
indem Sie ein weiteres ArrayField
als base_field
.
from django.db import models, IntegerField
from django.contrib.postgres.fields import ArrayField
class SudokuBoard(models.Model):
numbers = ArrayField(
ArrayField(
models.IntegerField(),
size=9,
),
size=9,
)
Abfrage aller Modelle, die ein Element in einer Liste enthalten, mit enthaltenem_by
Diese Abfrage gibt alle Zapfen entweder mit einem Minzlöffel oder einem Vanilleschaufel zurück.
minty_vanilla_cones = IceCream.objects.filter(scoops__contained_by=[MINT, VANILLA])