Django
ArrayField - een PostgreSQL-specifiek veld
Zoeken…
Syntaxis
- van django.contrib.postgres.fields import ArrayField
- class ArrayField (base_field, size = None, ** opties)
- FooModel.objects.filter (array_field_name__contains = [objecten, aan, vinkje])
- FooModel.objects.filter (array_field_name__contained_by = [objects, to, check])
Opmerkingen
Hoewel de parameter size
wordt doorgegeven aan PostgreSQL, zal PostgreSQL deze niet afdwingen.
Bij gebruik van ArrayField
moet men dit waarschuwingswoord uit de Postgresql arrays-documentatie onthouden.
Tip: Arrays zijn geen sets; zoeken naar specifieke array-elementen kan een teken zijn van database-misontwerp. Overweeg het gebruik van een afzonderlijke tabel met een rij voor elk item dat een array-element zou zijn. Dit is gemakkelijker te doorzoeken en zal waarschijnlijk beter schalen voor een groot aantal elementen.
Een standaard ArrayField
Om een PostgreSQL ArrayField te maken, moeten we ArrayField het type gegevens geven dat we als veld als eerste argument willen opslaan. Omdat we FloatField
opslaan, gebruiken we FloatField
.
from django.db import models, FloatField
from django.contrib.postgres.fields import ArrayField
class Book(models.Model):
ratings = ArrayField(FloatField())
De maximale grootte van een ArrayField opgeven
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
Wanneer u de parameter size gebruikt, wordt deze doorgegeven aan postgresql, die deze accepteert en vervolgens negeert! Het is dus heel goed mogelijk om 7 gehele getallen toe te voegen aan het scoops
veld hierboven met behulp van de postgresql-console.
Aanvraag voor lidmaatschap van ArrayField met bevat
Deze query retourneert alle kegels met een chocoladeschep en een vanilleschep.
VANILLA, CHOCOLATE, MINT, STRAWBERRY = 1, 2, 3, 4 # constants for flavors
choco_vanilla_cones = IceCream.objects.filter(scoops__contains=[CHOCOLATE, VANILLA])
Vergeet niet het IceCream
model te importeren vanuit uw models.py
bestand.
ArrayField
ook rekening mee dat django geen index maakt voor ArrayField
s. Als u ze wilt doorzoeken, hebt u een index nodig en deze moet handmatig worden gemaakt met een aanroep naar RunSQL in uw migratiebestand.
ArrayFields nesten
Je kunt ArrayField
nesten door een ander ArrayField
passeren terwijl het 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,
)
Opvragen voor alle modellen die een item in een lijst met contain_by bevatten
Deze query retourneert alle kegels met een muntschep of een vanilleschep.
minty_vanilla_cones = IceCream.objects.filter(scoops__contained_by=[MINT, VANILLA])