Ricerca…


Sintassi

  • da django.contrib.postgres.fields importa ArrayField
  • class ArrayField (base_field, size = None, ** opzioni)
  • FooModel.objects.filter (array_field_name__contains = [oggetti, a, controllo])
  • FooModel.objects.filter (array_field_name__contained_by = [oggetti, a, controllo])

Osservazioni

Nota che sebbene il parametro size sia passato a PostgreSQL, PostgreSQL non lo applicherà.

Quando si utilizza ArrayField si dovrebbe tenere a mente questa parola di avvertenza dalla documentazione degli array Postgresql .

Suggerimento: gli array non sono insiemi; la ricerca di specifici elementi dell'array può essere un segno di misdesign del database. Prendi in considerazione l'utilizzo di una tabella separata con una riga per ogni elemento che sarebbe un elemento dell'array. Questo sarà più facile da cercare, ed è probabile che scala in modo migliore per un gran numero di elementi.

Un ArrayField di base

Per creare un ArrayField PostgreSQL, dovremmo dare a ArrayField il tipo di dati che vogliamo archiviare come campo come primo argomento. Poiché archiviamo le valutazioni dei libri, utilizzeremo FloatField .

 from django.db import models, FloatField
 from django.contrib.postgres.fields import ArrayField
 
 class Book(models.Model):
     ratings = ArrayField(FloatField())

Specifica della dimensione massima di un 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

Quando si utilizza il parametro size, viene passato a postgresql, che lo accetta e quindi lo ignora! Quindi è abbastanza possibile aggiungere 7 interi al campo scoops sopra usando la console postgresql.

Interrogare per l'appartenenza a ArrayField con contiene

Questa query restituisce tutti i coni con una pallina di cioccolato e uno scoop alla vaniglia.

VANILLA, CHOCOLATE, MINT, STRAWBERRY = 1, 2, 3, 4  # constants for flavors
choco_vanilla_cones = IceCream.objects.filter(scoops__contains=[CHOCOLATE, VANILLA])

Non dimenticare di importare il modello IceCream dal tuo file models.py .

Ricorda inoltre che django non creerà un indice per ArrayField . Se stai andando a cercarli, avrai bisogno di un indice e dovrà essere creato manualmente con una chiamata a RunSQL nel tuo file di migrazione.

Nesting ArrayFields

È possibile nidificare ArrayField passando un altro ArrayField dato che è 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,
    )

Interrogazione per tutti i modelli che contengono elementi in un elenco con contained_by

Questa query restituisce tutti i coni con uno scoop alla menta o uno scoop alla vaniglia.

minty_vanilla_cones = IceCream.objects.filter(scoops__contained_by=[MINT, VANILLA])


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow