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


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow