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


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow