PostgreSQL-specifika modellfältLink to this heading
Alla dessa fält är tillgängliga från modulen django.contrib.postgres.fields.
Indexering av dessa fältLink to this heading
Index och Field.db_index skapar båda ett B-tree-index, vilket inte är särskilt användbart vid frågor om komplexa datatyper. Index som GinIndex och GistIndex är bättre lämpade, även om indexvalet beror på de frågor som du använder. Generellt kan GiST vara ett bra val för range fields och HStoreField, och GIN kan vara till hjälp för ArrayField.
ArrayFieldLink to this heading
- class ArrayField(base_field, size=None, **options)Link to this definition
Ett fält för lagring av listor med data. De flesta fälttyper kan användas, och du skickar en annan fältinstans som
base_field. Du kan också ange ensize.ArrayFieldkan nästlas för att lagra flerdimensionella matriser.Om du ger fältet en
default, se till att det är en callable somlist(för en tom standard) eller en callable som returnerar en lista (t.ex. en funktion). Felaktig användning avdefault=[]skapar en föränderlig standard som delas mellan alla instanser avArrayField.- base_fieldLink to this definition
Detta är ett nödvändigt argument.
Anger den underliggande datatypen och beteendet för arrayen. Det bör vara en instans av en underklass av
Field. Det kan t.ex. vara enIntegerFieldeller enCharField. De flesta fälttyper är tillåtna, med undantag för de som hanterar relationsdata (ForeignKey,OneToOneFieldochManyToManyField) och filfält (FileFieldochImageField).Det är möjligt att nesta array-fält - du kan ange en instans av
ArrayFieldsombase_field. Till exempel:from django.contrib.postgres.fields import ArrayField from django.db import models class ChessBoard(models.Model): board = ArrayField( ArrayField( models.CharField(max_length=10, blank=True), size=8, ), size=8, )Omvandling av värden mellan databasen och modellen, validering av data och konfiguration samt serialisering delegeras till det underliggande basfältet.
- sizeLink to this definition
Detta är ett valfritt argument.
Om den godkänns kommer matrisen att ha en maximal storlek enligt specifikationen. Detta kommer att skickas till databasen, även om PostgreSQL för närvarande inte verkställer begränsningen.
Fråga om ArrayFieldLink to this heading
Det finns ett antal anpassade lookups och transformationer för ArrayField. Vi kommer att använda följande exempelmodell:
from django.contrib.postgres.fields import ArrayField
from django.db import models
class Post(models.Model):
name = models.CharField(max_length=200)
tags = ArrayField(models.CharField(max_length=200), blank=True)
def __str__(self):
return self.name
innehållerLink to this heading
Uppslaget contains är åsidosatt på ArrayField. De returnerade objekten kommer att vara de där de värden som skickas är en delmängd av data. Den använder SQL-operatorn @>. Till exempel:
>>> Post.objects.create(name="First post", tags=["thoughts", "django"])
>>> Post.objects.create(name="Second post", tags=["thoughts"])
>>> Post.objects.create(name="Third post", tags=["tutorial", "django"])
>>> Post.objects.filter(tags__contains=["thoughts"])
<QuerySet [<Post: First post>, <Post: Second post>]>
>>> Post.objects.filter(tags__contains=["django"])
<QuerySet [<Post: First post>, <Post: Third post>]>
>>> Post.objects.filter(tags__contains=["django", "thoughts"])
<QuerySet [<Post: First post>]>
innehålls_avLink to this heading
Detta är motsatsen till contains - de objekt som returneras är de där data är en delmängd av de värden som skickats. Den använder SQL-operatorn <@. Till exempel:
>>> Post.objects.create(name="First post", tags=["thoughts", "django"])
>>> Post.objects.create(name="Second post", tags=["thoughts"])
>>> Post.objects.create(name="Third post", tags=["tutorial", "django"])
>>> Post.objects.filter(tags__contained_by=["thoughts", "django"])
<QuerySet [<Post: First post>, <Post: Second post>]>
>>> Post.objects.filter(tags__contained_by=["thoughts", "django", "tutorial"])
<QuerySet [<Post: First post>, <Post: Second post>, <Post: Third post>]>
överlappningLink to this heading
Returnerar objekt där data delar eventuella resultat med de värden som skickats. Använder SQL-operatorn &&. Till exempel:
>>> Post.objects.create(name="First post", tags=["thoughts", "django"])
>>> Post.objects.create(name="Second post", tags=["thoughts", "tutorial"])
>>> Post.objects.create(name="Third post", tags=["tutorial", "django"])
>>> Post.objects.filter(tags__overlap=["thoughts"])
<QuerySet [<Post: First post>, <Post: Second post>]>
>>> Post.objects.filter(tags__overlap=["thoughts", "tutorial"])
<QuerySet [<Post: First post>, <Post: Second post>, <Post: Third post>]>
>>> Post.objects.filter(tags__overlap=Post.objects.values_list("tags"))
<QuerySet [<Post: First post>, <Post: Second post>, <Post: Third post>]>
lenLink to this heading
Returnerar längden på arrayen. De uppslagningar som är tillgängliga efteråt är de som är tillgängliga för IntegerField. Till exempel:
>>> Post.objects.create(name="First post", tags=["thoughts", "django"])
>>> Post.objects.create(name="Second post", tags=["thoughts"])
>>> Post.objects.filter(tags__len=1)
<QuerySet [<Post: Second post>]>
Index omvandlasLink to this heading
Index transformerar index till matrisen. Alla icke-negativa heltal kan användas. Det blir inga fel om det överskrider size för matrisen. De uppslag som är tillgängliga efter transformationen är de från base_field. Till exempel:
>>> Post.objects.create(name="First post", tags=["thoughts", "django"])
>>> Post.objects.create(name="Second post", tags=["thoughts"])
>>> Post.objects.filter(tags__0="thoughts")
<QuerySet [<Post: First post>, <Post: Second post>]>
>>> Post.objects.filter(tags__1__iexact="Django")
<QuerySet [<Post: First post>]>
>>> Post.objects.filter(tags__276="javascript")
<QuerySet []>
SkivtransformationerLink to this heading
Slice-transformationer tar en slice av matrisen. Två icke-negativa heltal kan användas, åtskilda av ett enda understreck. De uppslagsord som är tillgängliga efter transformationen ändras inte. Till exempel:
>>> Post.objects.create(name="First post", tags=["thoughts", "django"])
>>> Post.objects.create(name="Second post", tags=["thoughts"])
>>> Post.objects.create(name="Third post", tags=["django", "python", "thoughts"])
>>> Post.objects.filter(tags__0_1=["thoughts"])
<QuerySet [<Post: First post>, <Post: Second post>]>
>>> Post.objects.filter(tags__0_2__contains=["thoughts"])
<QuerySet [<Post: First post>, <Post: Second post>]>
HStoreFieldLink to this heading
- class HStoreField(**options)Link to this definition
Ett fält för lagring av nyckel-värde-par. Python-datatypen som används är en
dict. Nycklar måste vara strängar och värden kan vara antingen strängar eller nollor (Nonei Python).För att använda detta fält måste du:
Lägg till
'django.contrib.postgres'i dinINSTALLED_APPS.Sätta upp hstore-tillägget i PostgreSQL.
Du kommer att se ett fel som
kan inte anpassa typen 'dict'om du hoppar över det första steget, ellertypen "hstore" finns inteom du hoppar över det andra.
Förfrågan på HStoreFieldLink to this heading
Förutom möjligheten att ställa frågor efter nyckel finns det ett antal anpassade uppslagningar tillgängliga för HStoreField.
Vi kommer att använda följande exempelmodell:
from django.contrib.postgres.fields import HStoreField
from django.db import models
class Dog(models.Model):
name = models.CharField(max_length=200)
data = HStoreField()
def __str__(self):
return self.name
NyckeluppslagningarLink to this heading
Om du vill göra en sökning baserad på en viss nyckel kan du använda den nyckeln som uppslagsnamn:
>>> Dog.objects.create(name="Rufus", data={"breed": "labrador"})
>>> Dog.objects.create(name="Meg", data={"breed": "collie"})
>>> Dog.objects.filter(data__breed="collie")
<QuerySet [<Dog: Meg>]>
Du kan kedja andra uppslagningar efter nyckeluppslagningar:
>>> Dog.objects.filter(data__breed__contains="l")
<QuerySet [<Dog: Rufus>, <Dog: Meg>]>
eller använda F()-uttryck för att kommentera ett nyckelvärde. Till exempel:
>>> from django.db.models import F
>>> rufus = Dog.objects.annotate(breed=F("data__breed"))[0]
>>> rufus.breed
'labrador'
Om den nyckel som du vill söka på krockar med namnet på en annan uppslagning måste du använda hstorefield.contains istället.
innehållerLink to this heading
Uppslaget contains är åsidosatt på HStoreField. De returnerade objekten är de där den givna dict av nyckel-värdepar alla finns i fältet. Den använder SQL-operatorn @>. Till exempel:
>>> Dog.objects.create(name="Rufus", data={"breed": "labrador", "owner": "Bob"})
>>> Dog.objects.create(name="Meg", data={"breed": "collie", "owner": "Bob"})
>>> Dog.objects.create(name="Fred", data={})
>>> Dog.objects.filter(data__contains={"owner": "Bob"})
<QuerySet [<Dog: Rufus>, <Dog: Meg>]>
>>> Dog.objects.filter(data__contains={"breed": "collie"})
<QuerySet [<Dog: Meg>]>
innehålls_avLink to this heading
Detta är inversen av contains - de objekt som returneras är de där nyckel-värdeparen på objektet är en delmängd av dem i det värde som skickas. SQL-operatorn <@ används. Till exempel:
>>> Dog.objects.create(name="Rufus", data={"breed": "labrador", "owner": "Bob"})
>>> Dog.objects.create(name="Meg", data={"breed": "collie", "owner": "Bob"})
>>> Dog.objects.create(name="Fred", data={})
>>> Dog.objects.filter(data__contained_by={"breed": "collie", "owner": "Bob"})
<QuerySet [<Dog: Meg>, <Dog: Fred>]>
>>> Dog.objects.filter(data__contained_by={"breed": "collie"})
<QuerySet [<Dog: Fred>]>
har_nyckelLink to this heading
Returnerar objekt där den angivna nyckeln finns i data. Använder SQL-operatorn ?. Till exempel:
>>> Dog.objects.create(name="Rufus", data={"breed": "labrador"})
>>> Dog.objects.create(name="Meg", data={"breed": "collie", "owner": "Bob"})
>>> Dog.objects.filter(data__has_key="owner")
<QuerySet [<Dog: Meg>]>
har_några_nycklarLink to this heading
Returnerar objekt där någon av de angivna nycklarna finns i data. Använder SQL-operatorn ?|. Till exempel:
>>> Dog.objects.create(name="Rufus", data={"breed": "labrador"})
>>> Dog.objects.create(name="Meg", data={"owner": "Bob"})
>>> Dog.objects.create(name="Fred", data={})
>>> Dog.objects.filter(data__has_any_keys=["owner", "breed"])
<QuerySet [<Dog: Rufus>, <Dog: Meg>]>
har_nycklarLink to this heading
Returnerar objekt där alla de angivna nycklarna finns i data. Använder SQL-operatorn ?&. Till exempel:
>>> Dog.objects.create(name="Rufus", data={})
>>> Dog.objects.create(name="Meg", data={"breed": "collie", "owner": "Bob"})
>>> Dog.objects.filter(data__has_keys=["breed", "owner"])
<QuerySet [<Dog: Meg>]>
nycklarLink to this heading
Returnerar objekt där matrisen med nycklar är det angivna värdet. Observera att ordningen inte garanteras vara tillförlitlig, så denna transform är främst användbar för att använda i samband med uppslagningar på ArrayField. Använder SQL-funktionen akeys(). Till exempel:
>>> Dog.objects.create(name="Rufus", data={"toy": "bone"})
>>> Dog.objects.create(name="Meg", data={"breed": "collie", "owner": "Bob"})
>>> Dog.objects.filter(data__keys__overlap=["breed", "toy"])
<QuerySet [<Dog: Rufus>, <Dog: Meg>]>
värdenLink to this heading
Returnerar objekt där matrisen av värden är det givna värdet. Observera att ordningen inte garanteras vara tillförlitlig, så denna transform är främst användbar för att använda i samband med uppslagningar på ArrayField. Använder SQL-funktionen avals(). Till exempel: avals():
>>> Dog.objects.create(name="Rufus", data={"breed": "labrador"})
>>> Dog.objects.create(name="Meg", data={"breed": "collie", "owner": "Bob"})
>>> Dog.objects.filter(data__values__contains=["collie"])
<QuerySet [<Dog: Meg>]>
Område FältLink to this heading
Det finns fem fältfältstyper som motsvarar de inbyggda intervalltyperna i PostgreSQL. Dessa fält används för att lagra ett intervall av värden; till exempel start- och sluttidsstämplarna för en händelse eller åldersintervallet som en aktivitet är lämplig för.
Alla intervallfält översätts till psycopg Range objects i Python, men accepterar också tuples som inmatning om ingen gränsinformation är nödvändig. Standardvärdet är nedre gräns inkluderad, övre gräns utesluten, det vill säga [) (se PostgreSQL-dokumentationen för detaljer om olika gränser). Standardgränserna kan ändras för icke-diskreta intervallfält (DateTimeRangeField och DecimalRangeField) med hjälp av argumentet default_bounds.
IntegerRangeFieldLink to this heading
- class IntegerRangeField(**options)Link to this definition
Lagrar ett intervall av heltal. Baserat på en
IntegerField. Representeras av enint4rangei databasen och endjango.db.backends.postgresql.psycopg_any.NumericRangei Python.Oavsett de gränser som anges när du sparar data returnerar PostgreSQL alltid ett intervall i en kanonisk form som inkluderar den nedre gränsen och utesluter den övre gränsen, det vill säga
[).
BigIntegerRangeFieldLink to this heading
- class BigIntegerRangeField(**options)Link to this definition
Lagrar ett intervall av stora heltal. Baserat på en
BigIntegerField. Representeras av enint8rangei databasen och endjango.db.backends.postgresql.psycopg_any.NumericRangei Python.Oavsett de gränser som anges när du sparar data returnerar PostgreSQL alltid ett intervall i en kanonisk form som inkluderar den nedre gränsen och utesluter den övre gränsen, det vill säga
[).
DecimalRangeFieldLink to this heading
- class DecimalRangeField(default_bounds='[)', **options)Link to this definition
Lagrar ett intervall av värden med flytande kommatecken. Baserat på en
DecimalField. Representeras av ennumrangei databasen och endjango.db.backends.postgresql.psycopg_any.NumericRangei Python.- default_boundsLink to this definition
Valfritt. Värdet på
boundsför list- och tupelingångar. Standardvärdet är nedre gränsen inkluderad, övre gränsen utesluten, det vill säga[)(se PostgreSQL-dokumentationen för detaljer om olika gränser).default_boundsanvänds inte fördjango.db.backends.postgresql.psycopg_any.NumericRangeinmatningar.
DatumTimeRangeFieldLink to this heading
- class DateTimeRangeField(default_bounds='[)', **options)Link to this definition
Lagrar ett intervall av tidsstämplar. Baserat på en
DateTimeField. Representeras av entstzrangei databasen och endjango.db.backends.postgresql.psycopg_any.DateTimeTZRangei Python.- default_boundsLink to this definition
Valfritt. Värdet på
boundsför list- och tupelingångar. Standardvärdet är nedre gränsen inkluderad, övre gränsen utesluten, det vill säga[)(se PostgreSQL-dokumentationen för detaljer om olika gränser).default_boundsanvänds inte fördjango.db.backends.postgresql.psycopg_any.DateTimeTZRangeinmatningar.
DatumintervallfältLink to this heading
- class DateRangeField(**options)Link to this definition
Lagrar ett intervall av datum. Baserat på en
DateField. Representeras av endaterangei databasen och endjango.db.backends.postgresql.psycopg_any.DateRangei Python.Oavsett de gränser som anges när du sparar data returnerar PostgreSQL alltid ett intervall i en kanonisk form som inkluderar den nedre gränsen och utesluter den övre gränsen, det vill säga
[).
Fråga efter intervallfältLink to this heading
Det finns ett antal anpassade uppslagningar och transformationer för intervallfält. De är tillgängliga för alla ovanstående fält, men vi kommer att använda följande exempelmodell:
from django.contrib.postgres.fields import IntegerRangeField
from django.db import models
class Event(models.Model):
name = models.CharField(max_length=200)
ages = IntegerRangeField()
start = models.DateTimeField()
def __str__(self):
return self.name
Vi kommer också att använda följande exempelobjekt:
>>> import datetime
>>> from django.utils import timezone
>>> now = timezone.now()
>>> Event.objects.create(name="Soft play", ages=(0, 10), start=now)
>>> Event.objects.create(
... name="Pub trip", ages=(21, None), start=now - datetime.timedelta(days=1)
... )
och NumericRange:
>>> from django.db.backends.postgresql.psycopg_any import NumericRange
InneslutningsfunktionerLink to this heading
Som med andra PostgreSQL-fält finns det tre standardinhållningsoperatörer: contains, contained_by och overlap, med hjälp av SQL-operatörerna @>, <@ och && respektive.
innehållerLink to this heading
>>> Event.objects.filter(ages__contains=NumericRange(4, 5))
<QuerySet [<Event: Soft play>]>
innehålls_avLink to this heading
>>> Event.objects.filter(ages__contained_by=NumericRange(0, 15))
<QuerySet [<Event: Soft play>]>
Uppslagningen contained_by är också tillgänglig för fälttyper som inte är intervall: SmallAutoField, AutoField, BigAutoField, SmallIntegerField, IntegerField, BigIntegerField.db.models.IntegerField`, BigIntegerField, DecimalField, FloatField, DateField, och DateTimeField. Till exempel:
>>> from django.db.backends.postgresql.psycopg_any import DateTimeTZRange
>>> Event.objects.filter(
... start__contained_by=DateTimeTZRange(
... timezone.now() - datetime.timedelta(hours=1),
... timezone.now() + datetime.timedelta(hours=1),
... ),
... )
<QuerySet [<Event: Soft play>]>
överlappningLink to this heading
>>> Event.objects.filter(ages__overlap=NumericRange(8, 12))
<QuerySet [<Event: Soft play>]>
JämförelsefunktionerLink to this heading
Range-fält stöder standarduppslagningar: lt, gt, lte och gte. Dessa är inte särskilt användbara - de jämför de nedre gränserna först och sedan de övre gränserna endast om det behövs. Detta är också den strategi som används för att beställa efter ett intervallfält. Det är bättre att använda de specifika operatörerna för jämförelse av intervall.
fullständigt_ltLink to this heading
De returnerade intervallen är strikt mindre än det passerade intervallet. Med andra ord är alla punkter i det returnerade intervallet mindre än alla punkter i det passerade intervallet.
>>> Event.objects.filter(ages__fully_lt=NumericRange(11, 15))
<QuerySet [<Event: Soft play>]>
fullständigt_gtLink to this heading
De returnerade intervallen är strikt större än det passerade intervallet. Med andra ord är alla punkter i det returnerade intervallet större än alla punkter i det passerade intervallet.
>>> Event.objects.filter(ages__fully_gt=NumericRange(11, 15))
<QuerySet [<Event: Pub trip>]>
not_ltLink to this heading
De returnerade intervallen innehåller inte några punkter som är mindre än det passerade intervallet, dvs. den nedre gränsen för det returnerade intervallet är minst den nedre gränsen för det passerade intervallet.
>>> Event.objects.filter(ages__not_lt=NumericRange(0, 15))
<QuerySet [<Event: Soft play>, <Event: Pub trip>]>
not_gtLink to this heading
De returnerade intervallen innehåller inte några punkter som är större än det passerade intervallet, dvs. den övre gränsen för det returnerade intervallet är högst den övre gränsen för det passerade intervallet.
>>> Event.objects.filter(ages__not_gt=NumericRange(3, 10))
<QuerySet [<Event: Soft play>]>
”intilliggandeLink to this heading
De returnerade intervallen delar en bindning med det passerade intervallet.
>>> Event.objects.filter(ages__adjacent_to=NumericRange(10, 21))
<QuerySet [<Event: Soft play>, <Event: Pub trip>]>
Förfrågan med hjälp av gränsernaLink to this heading
Range-fält stöder flera extra uppslagningar.
börjar medLink to this heading
Returnerade objekt har den angivna nedre gränsen. Kan kedjas till giltiga uppslagningar för basfältet.
>>> Event.objects.filter(ages__startswith=21)
<QuerySet [<Event: Pub trip>]>
slutar medLink to this heading
Returnerade objekt har den angivna övre gränsen. Kan kedjas till giltiga uppslagningar för basfältet.
>>> Event.objects.filter(ages__endswith=10)
<QuerySet [<Event: Soft play>]>
isemptyLink to this heading
Returnerade objekt är tomma intervall. Kan kedjas till giltiga uppslagningar för en BooleanField.
>>> Event.objects.filter(ages__isempty=True)
<QuerySet []>
lägre_incLink to this heading
Returnerar objekt som har inkluderande eller exklusiva nedre gränser, beroende på det booleska värdet som skickas. Kan kedjas till giltiga uppslagningar för en BooleanField.
>>> Event.objects.filter(ages__lower_inc=True)
<QuerySet [<Event: Soft play>, <Event: Pub trip>]>
lägre_infLink to this heading
Returnerar objekt som har obegränsad (oändlig) eller begränsad nedre gräns, beroende på det booleska värdet som skickas. Kan kedjas till giltiga uppslagningar för en BooleanField.
>>> Event.objects.filter(ages__lower_inf=True)
<QuerySet []>
övre_incLink to this heading
Returnerar objekt som har inkluderande eller exklusiva övre gränser, beroende på det booleska värdet som skickas. Kan kedjas till giltiga uppslagningar för en BooleanField.
>>> Event.objects.filter(ages__upper_inc=True)
<QuerySet []>
övre_infLink to this heading
Returnerar objekt som har obegränsad (oändlig) eller begränsad övre gräns, beroende på det booleska värdet som skickas. Kan kedjas till giltiga uppslagningar för en BooleanField.
>>> Event.objects.filter(ages__upper_inf=True)
<QuerySet [<Event: Pub trip>]>
Definiera dina egna sortimentstyperLink to this heading
PostgreSQL tillåter definitionen av anpassade intervalltyper. Djangos modell- och formulärfältimplementeringar använder basklasser nedan, och psycopg tillhandahåller en register_range() för att tillåta användning av anpassade intervalltyper.
- class RangeField(**options)Link to this definition
Basklass för modellområdesfält.
- base_fieldLink to this definition
Den modellfältklass som ska användas.
- range_typeLink to this definition
Den intervalltyp som ska användas.
- form_fieldLink to this definition
Klassen för formulärfältet som ska användas. Bör vara en underklass av
django.contrib.postgres.forms.BaseRangeField.
- class django.contrib.postgres.forms.BaseRangeFieldLink to this definition
Basklass för fält i formulärintervall.
- base_fieldLink to this definition
Det formulärfält som ska användas.
- range_typeLink to this definition
Den intervalltyp som ska användas.
Operatörer inom områdetLink to this heading
- class RangeOperatorsLink to this definition
PostgreSQL tillhandahåller en uppsättning SQL-operatörer som kan användas tillsammans med intervalldatatyperna (se PostgreSQL-dokumentationen för fullständig information om intervalloperatörer). Denna klass är tänkt som en bekväm metod för att undvika skrivfel. Operatörsnamnen överlappar namnen på motsvarande uppslagningar.
class RangeOperators:
EQUAL = "="
NOT_EQUAL = "<>"
CONTAINS = "@>"
CONTAINED_BY = "<@"
OVERLAPS = "&&"
FULLY_LT = "<<"
FULLY_GT = ">>"
NOT_LT = "&>"
NOT_GT = "&<"
ADJACENT_TO = "-|-"
RangeBoundary() uttryckLink to this heading
- class RangeBoundary(inclusive_lower=True, inclusive_upper=False)Link to this definition
- inclusive_lowerLink to this definition
Om
True(standard), är den nedre gränsen inkluderande'[', annars är den exklusiv'('.
- inclusive_upperLink to this definition
Om
False(standard), är den övre gränsen exklusiv')', annars är den inkluderande']'.
Ett RangeBoundary()-uttryck representerar intervallgränserna. Det kan användas med anpassade intervallfunktioner som förväntade gränser, till exempel för att definiera ExclusionConstraint. Se PostgreSQL-dokumentationen för fullständiga detaljer.