Szukaj…


Składnia

  • z django.contrib.postgres.fields import ArrayField
  • klasa ArrayField (pole_podstawowe, rozmiar = Brak, ** opcje)
  • FooModel.objects.filter (nazwa_pola_pliku__contains = [obiekty, do sprawdzenia])
  • FooModel.objects.filter (nazwa_pola_kablu__contained_by = [obiekty, do sprawdzenia])

Uwagi

Zauważ, że chociaż parametr size jest przekazywany do PostgreSQL, PostgreSQL go nie wymusi.

Korzystając z ArrayField należy pamiętać o tym ostrzeżeniu z dokumentacji tablic Postgresql .

Wskazówka: Tablice nie są zestawami; wyszukiwanie określonych elementów tablicy może być oznaką błędnego zaprojektowania bazy danych. Rozważ zastosowanie oddzielnej tabeli z wierszem dla każdego elementu, który byłby elementem tablicy. Będzie to łatwiejsze do przeszukiwania i prawdopodobnie skaluje się lepiej dla dużej liczby elementów.

Podstawowy ArrayField

Aby utworzyć ArrayField PostgreSQL, powinniśmy podać ArrayField typ danych, które chcemy przechowywać jako pole jako pierwszy argument. Ponieważ będziemy przechowywać oceny książek, użyjemy FloatField .

 from django.db import models, FloatField
 from django.contrib.postgres.fields import ArrayField
 
 class Book(models.Model):
     ratings = ArrayField(FloatField())

Określanie maksymalnego rozmiaru ArrayField

 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

Kiedy używasz parametru size, jest on przekazywany do postgresql, który go akceptuje, a następnie ignoruje! Dlatego całkiem możliwe jest dodanie 7 liczb całkowitych do powyższego pola scoops za pomocą konsoli postgresql.

Zapytanie o członkostwo ArrayField z zawiera

To zapytanie zwraca wszystkie szyszki z gałką czekolady i gałką wanilii.

VANILLA, CHOCOLATE, MINT, STRAWBERRY = 1, 2, 3, 4  # constants for flavors
choco_vanilla_cones = IceCream.objects.filter(scoops__contains=[CHOCOLATE, VANILLA])

Nie zapomnij zaimportować modelu IceCream z pliku models.py .

Pamiętaj również, że django nie utworzy indeksu dla ArrayField . Jeśli zamierzasz je przeszukać, potrzebujesz indeksu, który trzeba będzie utworzyć ręcznie za pomocą wywołania RunSQL w pliku migracji.

Zagnieżdżanie ArrayFields

Możesz zagnieździć ArrayField , przekazując inny ArrayField ponieważ jest to 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,
    )

Zapytanie dla wszystkich modeli, które zawierają dowolny element na liście z zawartością

To zapytanie zwraca wszystkie szyszki z gałką mięty lub gałką wanilii.

minty_vanilla_cones = IceCream.objects.filter(scoops__contained_by=[MINT, VANILLA])


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow