Django
ArrayField - un campo specifico PostgreSQL
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])