Champs de modèles spécifiques à PostgreSQLLien vers cette rubrique
Tous ces champs sont disponibles dans le module django.contrib.postgres.fields.
Indexation de ces champsLien vers cette rubrique
Index et Field.db_index créent les deux un index B-tree, ce qui n’est pas spécialement utile lors de requêtes sur des types de données complexes. Les index tels que GinIndex et GistIndex sont mieux adaptés, même si le choix de l’index dépend des requêtes effectivement utilisées. En général, GiST est un bon choix pour les champs d’intervalle et le champ HStoreField, alors que GIN est souvent utile pour les champs ArrayField et JSONField.
ArrayFieldLien vers cette rubrique
- class ArrayField(base_field, size=None, **options)Lien vers cette définition
Un champ pour stocker des listes de données. La plupart des types de champs peuvent être utilisés ; il suffit de passer une autre instance de champ dans l’attribut
base_field. Vous pouvez aussi indiquer une taille danssize.ArrayFieldpeut être imbriqué pour stocker des tableaux multidimensionnels.Si vous donnez une valeur
defaultà ce champ, assurez-vous que ce soit un objet exécutable tel quelist(pour une valeur par défaut vide) ou un objet exécutable qui renvoie une liste (par exemple une fonction). L’utilisation dedefault=[]n’est pas correct car cela crée une valeur par défaut mutante qui est partagée entre les instances deArrayField.- base_fieldLien vers cette définition
Ce paramètre est obligatoire.
Définit le type de données sous-jacent et le comportement du tableau. Il devrait s’agir d’une instance d’une sous-classe de
Field. Par exemple, cela pourrait être unIntegerFieldou unCharField. La plupart des types de champs sont autorisés, à l’exception de ceux qui gèrent des données relationnelles (ForeignKey,OneToOneFieldetManyToManyField).Il est possible d’imbriquer des champs tabulaires, c’est-à-dire que
base_fieldpeut contenir une instance deArrayField. Par exemple :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, )La transformation de valeurs entre la base de données et le modèle, la validation de données et la configuration ainsi que la sérialisation sont tous délégués au champ de base sous-jacent.
- sizeLien vers cette définition
Ce paramètre est facultatif.
Si présent, le tableau aura la taille maximale indiquée. Cette valeur est transmise à la base de données, même si PostgreSQL n’applique actuellement pas cette restriction.
Interrogation de ArrayFieldLien vers cette rubrique
Il existe plusieurs recherches et transformations spécifiques au champ ArrayField. Nous allons utiliser le modèle d’exemple suivant :
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
containsLien vers cette rubrique
La recherche contains est surchargée pour ArrayField. Les objets renvoyés sont ceux pour qui les valeurs transmises forment un sous-ensemble des données. Elle utilise l’opérateur SQL @>. Par exemple :
>>> 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>]>
contained_byLien vers cette rubrique
Il s’agit de l’inverse de la recherche contains, les objets renvoyés sont ceux pour qui les données forment un sous-ensemble des valeurs transmises. Elle utilise l’opérateur SQL <@. Par exemple :
>>> 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>]>
overlapLien vers cette rubrique
Renvoie les objets dont les données contiennent au moins une valeur en commun avec celles transmises. Utilise l’opérateur SQL &&. Par exemple :
>>> 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__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>]>
lenLien vers cette rubrique
Renvoie la longueur du tableau. Les recherches disponibles à la suite de celle-ci sont celles qui sont disponibles pour les champs IntegerField. Par exemple :
>>> 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>]>
Transformations d’indiceLien vers cette rubrique
Les transformations d’index indicent dans les tableaux. Tout nombre entier non négatif est utilisable. Aucune erreur n’est produite si l’indice dépasse la taille size du tableau. Les recherches disponibles à la suite de la transformation sont celles du champ base_field. Par exemple :
>>> 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 []>
Transformations de segmentationLien vers cette rubrique
Les transformations de segmentation segmentent dans les tableaux. Toute paire de nombres entiers non négatifs peut être utilisée, séparée par un seul soulignement. Les recherches disponibles après la transformation ne changent pas. Par exemple :
>>> 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>]>
Champs CITextLien vers cette rubrique
- class CIText(**options)Lien vers cette définition
Une classe mixin pour créer des champs texte insensibles à la casse soutenus par le type citext. Lisez les conséquences au niveau des performances avant de l’utiliser.
Pour utiliser
citext, employez l’opérationCITextExtensionafin de configurer l’extension citext dans PostgreSQL avant la première opération de migrationCreateModel.Si vous utilisez un champ
ArrayFielddeCIText, vous devez ajouter'django.contrib.postgres'dans votre réglageINSTALLED_APPS, sinon les valeurs de champs apparaîtront sous forme de chaînes comme'{thoughts,django}'.Plusieurs champs qui utilisent cette classe mixin sont fournis :
- class CICharField(**options)Lien vers cette définition
- class CIEmailField(**options)Lien vers cette définition
- class CITextField(**options)Lien vers cette définition
Ces champs héritent respectivement de
CharField,EmailFieldetTextField.max_lengthne sera pas vérifiée au niveau de la base de données carcitextse comporte comme le type PostgreSQLtext.
HStoreFieldLien vers cette rubrique
- class HStoreField(**options)Lien vers cette définition
Un champ pour stocker des paires clé-valeur. Le type de données Python utilisé est un dictionnaire
dict. Les clés doivent être des chaînes et les valeurs peuvent être soit des chaînes, soit la valeur nulle (Noneen Python).Pour utiliser ce champ, il faut :
Ajouter
'django.contrib.postgres'à votre réglageINSTALLED_APPS.Configurer l’extension hstore dans PostgreSQL.
Vous verrez une erreur du genre
can't adapt type 'dict'si vous omettez la première étape, outype "hstore" does not existsi vous omettez la seconde.
Interrogation de HStoreFieldLien vers cette rubrique
En plus de la possibilité d’interroger en fonction de la clé, il existe quelques recherches tout exprès pour les champs HStoreField.
Nous allons utiliser le modèle d’exemple suivant :
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
Recherches par cléLien vers cette rubrique
Pour rechercher en fonction d’une clé donnée, il suffit d’utiliser cette clé comme nom de requête :
>>> 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>]>
Il est possible d’enchaîner d’autres recherches après une recherche par clé :
>>> Dog.objects.filter(data__breed__contains='l')
<QuerySet [<Dog: Rufus>, <Dog: Meg>]>
Si la clé avec laquelle vous souhaitez rechercher entre en conflit avec le nom d’une recherche existante, vous devez utiliser la recherche hstorefield.contains à la place.
containsLien vers cette rubrique
La recherche contains est surchargée pour HStoreField. Les objets renvoyés sont ceux pour qui le dictionnaire de paires clé-valeur est totalement contenu dans le champ. Elle utilise l’opérateur SQL @>. Par exemple :
>>> 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>]>
contained_byLien vers cette rubrique
Il s’agit de l’inverse de la recherche contains, les objets renvoyés sont ceux pour qui les paires de clé-valeur forment un sous-ensemble des valeurs transmises. Elle utilise l’opérateur SQL <@. Par exemple :
>>> 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>]>
has_keyLien vers cette rubrique
Renvoie les objets dont les données contiennent la clé indiquée. Utilise l’opérateur SQL ?. Par exemple :
>>> 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>]>
has_any_keysLien vers cette rubrique
Renvoie les objets dont les données contiennent au moins une des clés indiquées. Utilise l’opérateur SQL ?|. Par exemple :
>>> 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>]>
has_keysLien vers cette rubrique
Renvoie les objets dont les données contiennent toutes les clés indiquées. Utilise l’opérateur SQL ?&. Par exemple :
>>> 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>]>
keysLien vers cette rubrique
Renvoie l’ensemble des clés des objets concernés. Notez que l’ordre n’est pas garanti, ce qui fait que cette transformation est surtout utile quand elle est combinée à des recherches sur ArrayField. Utilise la fonction SQL akeys(). Par exemple :
>>> 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>]>
valuesLien vers cette rubrique
Renvoie l’ensemble des valeurs des objets concernés. Notez que l’ordre n’est pas garanti, ce qui fait que cette transformation est surtout utile quand elle est combinée à des recherches sur ArrayField. Utilise la fonction SQL avalues(). Par exemple :
>>> 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>]>
JSONFieldLien vers cette rubrique
- class JSONField(encoder=None, **options)Lien vers cette définition
Un champ pour stocker des données JSON encodées. En Python, les données sont représentées dans leur format natif correspondant : dictionnaires, listes, chaînes, nombres, booléens et
None.- encoderLien vers cette définition
Une classe facultative de codage en JSON pour sérialiser les types de données non prises en charge par le sérialiseur JSON standard (
datetime,uuid, etc.). Par exemple, vous pouvez utiliser la classeDjangoJSONEncoderou toute autre classe héritant dejson.JSONEncoder.Lorsque la valeur est récupérée de la base de données, elle sera dans le format choisi par le codeur personnalisé (la plupart du temps une chaîne), il vous faudra donc intervenir pour reconvertir la valeur dans le type de données initial (
Model.from_db()etField.from_db_value()sont deux points d’entrée possibles pour cela). La désérialisation pourrait devoir tenir compte de l’incertitude liée au type de la valeur d’entrée. Par exemple, vous courez le risque de renvoyer un objetdatetimequi était en fait une chaîne qui était fortuitement au même format que celui choisi pour les objetsdatetime.
Si vous donnez une valeur
defaultà ce champ, assurez-vous que ce soit un objet exécutable tel quedict(pour une valeur par défaut vide) ou un objet exécutable qui renvoie un dictionnaire (par exemple une fonction). L’utilisation dedefault={}n’est pas correct car cela crée une valeur par défaut mutante qui est partagée entre les instances deJSONField.
Interrogation de JSONFieldLien vers cette rubrique
Nous allons utiliser le modèle d’exemple suivant :
from django.contrib.postgres.fields import JSONField
from django.db import models
class Dog(models.Model):
name = models.CharField(max_length=200)
data = JSONField()
def __str__(self):
return self.name
Interrogations de clé, d’indice et de cheminLien vers cette rubrique
Pour rechercher en fonction d’une clé de dictionnaire donnée, il suffit d’utiliser cette clé comme nom de requête :
>>> Dog.objects.create(name='Rufus', data={
... 'breed': 'labrador',
... 'owner': {
... 'name': 'Bob',
... 'other_pets': [{
... 'name': 'Fishy',
... }],
... },
... })
>>> Dog.objects.create(name='Meg', data={'breed': 'collie', 'owner': None})
>>> Dog.objects.filter(data__breed='collie')
<QuerySet [<Dog: Meg>]>
Il est possible d’enchaîner plusieurs clés pour former une recherche de chemin :
>>> Dog.objects.filter(data__owner__name='Bob')
<QuerySet [<Dog: Rufus>]>
Si la clé est un entier, elle sera interprétée comme une recherche d’indice de tableau :
>>> Dog.objects.filter(data__owner__other_pets__0__name='Fishy')
<QuerySet [<Dog: Rufus>]>
Si la clé avec laquelle vous souhaitez rechercher entre en conflit avec le nom d’une recherche existante, utilisez la recherche jsonfield.contains à la place.
Si une seule clé ou indice est donnée, l’opérateur SQL -> est utilisé. Si plusieurs opérateurs sont donnés, alors c’est l’opérateur #> qui est utilisé.
Pour rechercher une valeur nulle dans des données JSON, utilisez None comme valeur
>>> Dog.objects.filter(data__owner=None)
<QuerySet [<Dog: Meg>]>
Pour rechercher des clés manquantes, utilisez l’expression de recherche isnull:
>>> Dog.objects.create(name='Shep', data={'breed': 'collie'})
>>> Dog.objects.filter(data__owner__isnull=True)
<QuerySet [<Dog: Shep>]>
Opérations de contenance et de cléLien vers cette rubrique
JSONField partage les interrogations liées à la contenance et aux clés avec le champ HStoreField.
contains(accepte n’importe quel JSON et pas seulement un dictionnaire de chaînes)contained_by(accepte n’importe quel JSON et pas seulement un dictionnaire de chaînes)
Champs d’intervalleLien vers cette rubrique
Il existe cinq types de champs d’intervalle, correspondant au types d’intervalles natifs de PostgreSQL. Ces champs sont utilisés pour stocker un intervalle de valeurs ; par exemple, l’heure de début et de fin d’un événement ou l’intervalle des âges appropriés à une activité.
Tous les champs d’intervalle produisent des objets Range psycopg2 en Python, mais acceptent aussi des tuples en entrée si aucune information de limite n’est nécessaire. Par défaut, la limite inférieure est incluse et la limite supérieure exclue ; c’est-à-dire [).
IntegerRangeFieldLien vers cette rubrique
- class IntegerRangeField(**options)Lien vers cette définition
Stocke un intervalle de nombres entiers. Basé sur un
IntegerField. Représenté par unint4rangedans la base de données et unNumericRangeen Python.Quelles que soient les limites indiquées lors de l’enregistrement des données, PostgreSQL renvoie toujours un intervalle dans sa forme canonique qui inclut la limite inférieure et exclut la limite supérieure ; c’est-à-dire
[).
BigIntegerRangeFieldLien vers cette rubrique
- class BigIntegerRangeField(**options)Lien vers cette définition
Stocke un intervalle de nombres entiers étendus. Basé sur un
BigIntegerField. Représenté par unint8rangedans la base de données et unNumericRangeen Python.Quelles que soient les limites indiquées lors de l’enregistrement des données, PostgreSQL renvoie toujours un intervalle dans sa forme canonique qui inclut la limite inférieure et exclut la limite supérieure ; c’est-à-dire
[).
DecimalRangeFieldLien vers cette rubrique
- class DecimalRangeField(**options)Lien vers cette définition
-
Stocke un intervalle de valeurs en virgule flottante. Basé sur un
DecimalField. Représenté par unnumrangedans la base de données et unNumericRangeen Python.
FloatRangeFieldLien vers cette rubrique
- class FloatRangeField(**options)Lien vers cette définition
Stocke un intervalle de valeurs en virgule flottante. Basé sur un
FloatField. Représenté par unnumrangedans la base de données et unNumericRangeen Python.
DateTimeRangeFieldLien vers cette rubrique
- class DateTimeRangeField(**options)Lien vers cette définition
Stocke un intervalle de date/heures. Basé sur la classe
DateTimeField. Représenté par untstzrangedans la base de données et par unDateTimeTZRangedans Python.
DateRangeFieldLien vers cette rubrique
- class DateRangeField(**options)Lien vers cette définition
Stocke un intervalle de dates. Basé sur un
DateField. Représenté par undaterangedans la base de données et unDateRangeen Python.Quelles que soient les limites indiquées lors de l’enregistrement des données, PostgreSQL renvoie toujours un intervalle dans sa forme canonique qui inclut la limite inférieure et exclut la limite supérieure ; c’est-à-dire
[).
Interrogation de champs d’intervalleLien vers cette rubrique
Il existe un certain nombre de recherches et de transformations spécifiques aux champs d’intervalle. Ils sont disponibles pour tous les champs ci-dessus, mais nous allons utiliser le modèle d’exemple suivant :
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
Nous allons aussi utiliser les objets d’exemple suivants :
>>> 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))
et NumericRange:
>>> from psycopg2.extras import NumericRange
Fonctions de contenanceLien vers cette rubrique
Comme pour les autres champs PostgreSQL, trois opérateurs de contenance standard sont disponibles : contains, contained_by et overlap, utilisant respectivement les opérateurs SQL @>, <@ et &&.
containsLien vers cette rubrique
>>> Event.objects.filter(ages__contains=NumericRange(4, 5))
<QuerySet [<Event: Soft play>]>
contained_byLien vers cette rubrique
>>> Event.objects.filter(ages__contained_by=NumericRange(0, 15))
<QuerySet [<Event: Soft play>]>
La recherche contained_by est aussi disponible pour les types de champ autres que intervalle : IntegerField, BigIntegerField, FloatField, DateField et DateTimeField. Par exemple :
>>> from psycopg2.extras 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>]>
overlapLien vers cette rubrique
>>> Event.objects.filter(ages__overlap=NumericRange(8, 12))
<QuerySet [<Event: Soft play>]>
Fonctions de comparaisonLien vers cette rubrique
Les champs d’intervalle prennent en charge les recherches standard : lt, gt, lte et gte. Elles ne sont pas particulièrement utiles, la comparaison s’opère d’abord sur la limite inférieure et si nécessaire, sur la limite supérieure ensuite. C’est également la stratégie adoptée pour trier selon un champ d’intervalle. Il est recommandé d’utiliser plutôt les opérateurs spécifiques de comparaison d’intervalle.
fully_ltLien vers cette rubrique
Les intervalles renvoyés sont strictement inférieurs à l’intervalle transmis. En d’autres termes, tous les points d’un intervalle renvoyé sont plus petits que tous ceux de l’intervalle transmis.
>>> Event.objects.filter(ages__fully_lt=NumericRange(11, 15))
<QuerySet [<Event: Soft play>]>
fully_gtLien vers cette rubrique
Les intervalles renvoyés sont strictement supérieurs à l’intervalle transmis. En d’autres termes, tous les points d’un intervalle renvoyé sont plus grands que tous ceux de l’intervalle transmis.
>>> Event.objects.filter(ages__fully_gt=NumericRange(11, 15))
<QuerySet [<Event: Pub trip>]>
not_ltLien vers cette rubrique
Les intervalles renvoyés ne contiennent aucun élément plus petit que ceux de l’intervalle transmis, c’est-à-dire que la limite inférieure d’un intervalle renvoyé est au moins égale à la limite inférieure de l’intervalle transmis.
>>> Event.objects.filter(ages__not_lt=NumericRange(0, 15))
<QuerySet [<Event: Soft play>, <Event: Pub trip>]>
not_gtLien vers cette rubrique
Les intervalles renvoyés ne contiennent aucun élément plus grand que ceux de l’intervalle transmis, c’est-à-dire que la limite supérieure d’un intervalle renvoyé n’est pas plus grande que la limite supérieure de l’intervalle transmis.
>>> Event.objects.filter(ages__not_gt=NumericRange(3, 10))
<QuerySet [<Event: Soft play>]>
adjacent_toLien vers cette rubrique
Les intervalles renvoyés partagent une limite avec l’intervalle transmis.
>>> Event.objects.filter(ages__adjacent_to=NumericRange(10, 21))
<QuerySet [<Event: Soft play>, <Event: Pub trip>]>
Interrogation à l’aide des limitesLien vers cette rubrique
Trois transformations sont disponibles pour être utilisées dans les requêtes. Vous pouvez extraire la limite inférieure ou supérieure, ou interroger sur la base de l’intervalle vide.
startswithLien vers cette rubrique
Les objets renvoyés possèdent la limite inférieure indiquée. Peut être suivie par des recherches valides pour le champ de base.
>>> Event.objects.filter(ages__startswith=21)
<QuerySet [<Event: Pub trip>]>
endswithLien vers cette rubrique
Les objets renvoyés possèdent la limite supérieure indiquée. Peut être suivie par des recherches valides pour le champ de base.
>>> Event.objects.filter(ages__endswith=10)
<QuerySet [<Event: Soft play>]>
isemptyLien vers cette rubrique
Les objets renvoyés sont des intervalles vides. Peut être suivie par des recherches valides pour un champ BooleanField.
>>> Event.objects.filter(ages__isempty=True)
<QuerySet []>
Définition de ses propres types d’intervalleLien vers cette rubrique
PostgreSQL permet de définir ses propres types d’intervalle. Les implémentations de champs de modèle et de formulaire de Django utilisent les classes de base ci-dessous, et psycopg2 propose une fonction register_range() pour permettre l’utilisation de types d’intervalle personnalisés.
- class RangeField(**options)Lien vers cette définition
Classe de base pour les champs de modèle de type intervalle.
- base_fieldLien vers cette définition
La classe de champ de modèle à utiliser.
- range_typeLien vers cette définition
Le type d’intervalle psycopg2 à utiliser.
- form_fieldLien vers cette définition
La classe de champ de formulaire à utiliser. Doit être une sous-classe de
django.contrib.postgres.forms.BaseRangeField.
- class django.contrib.postgres.forms.BaseRangeFieldLien vers cette définition
Classe de base pour les champs de formulaire de type intervalle.
- base_fieldLien vers cette définition
Le champ de formulaire à utiliser.
- range_typeLien vers cette définition
Le type d’intervalle psycopg2 à utiliser.