Django
ArrayField - ett PostgreSQL-specifikt fält
Sök…
Syntax
- från django.contrib.postgres.fields importerar ArrayField
- klass ArrayField (base_field, size = None, ** optioner)
- FooModel.objects.filter (array_field_name__contain = [objekt, till, kontroll])
- FooModel.objects.filter (array_field_name__contained_by = [objekt, till, kontroll])
Anmärkningar
Observera att även om size
överförs till PostgreSQL, kommer PostgreSQL inte att verkställa den.
När man använder ArrayField
bör man tänka på detta varningsord från Postgresql arrays dokumentation .
Tips: Matriser är inte uppsättningar; Att söka efter specifika arrayelement kan vara ett tecken på felaktig design av databasen. Överväg att använda en separat tabell med en rad för varje objekt som skulle vara ett arrayelement. Detta kommer att vara lättare att söka och kommer troligen att skala bättre för ett stort antal element.
En grundläggande ArrayField
För att skapa ett PostgreSQL ArrayField bör vi ge ArrayField den typ av data vi vill att den ska lagra som ett fält som sitt första argument. Eftersom vi lagrar bokbetyg kommer vi att använda FloatField
.
from django.db import models, FloatField
from django.contrib.postgres.fields import ArrayField
class Book(models.Model):
ratings = ArrayField(FloatField())
Ange den maximala storleken på en 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
När du använder storleksparametern överförs den till postgresql, som accepterar den och sedan ignorerar den! Därför är det fullt möjligt att lägga till 7 heltal till scoops
fältet ovan med postgresql-konsolen.
Fråga efter medlemskap i ArrayField med innehåller
Denna fråga returnerar alla kottar med en chokladskopa och en vaniljeskopa.
VANILLA, CHOCOLATE, MINT, STRAWBERRY = 1, 2, 3, 4 # constants for flavors
choco_vanilla_cones = IceCream.objects.filter(scoops__contains=[CHOCOLATE, VANILLA])
Glöm inte att importera IceCream
modellen från din models.py
fil.
Tänk också på att django inte kommer att skapa ett index för ArrayField
s. Om du ska söka efter dem behöver du ett index och det måste skapas manuellt med ett samtal till RunSQL i din migreringsfil.
Häckande ArrayFields
Du kan häcka ArrayField
genom att passera en annan ArrayField
eftersom det är 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,
)
Fråga efter alla modeller som innehåller något objekt i en lista med contain_by
Denna fråga returnerar alla kottar med antingen en mintskopa eller en vaniljeskopa.
minty_vanilla_cones = IceCream.objects.filter(scoops__contained_by=[MINT, VANILLA])