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])


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow