Django
ArrayField - pole specyficzne dla PostgreSQL
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])