Référence des index de modèleLien vers cette rubrique

Les classes d’index facilitent la création d’index de base de données. Elles peuvent être ajoutées avec l’option Meta.indexes. Ce document détaille les références d’API de Index ce qui inclut les options d’index.

Options d”IndexLien vers cette rubrique

class Index(*expressions, fields=(), name=None, db_tablespace=None, opclasses=(), condition=None, include=None)Lien vers cette définition

Crée un index (B-Tree) dans la base de données.

expressionsLien vers cette rubrique

Index.expressionsLien vers cette définition

L’argument positionnel *expressions permet de créer des index fonctionnels sur des expressions et des fonctions de base de données.

Par exemple :

Code
Index(Lower("title").desc(), "pub_date", name="lower_title_date_idx")

crée un index sur la valeur en minuscules du champ title dans l’ordre alphabétique inverse et le champ pub_date dans l’ordre alphabétique par défaut.

Un autre exemple :

Code
Index(F("height") * F("weight"), Round("weight"), name="calc_idx")

crée un index sur le résultat de la multiplication des champs height et weight avec le champ weight arrondi à l’entier le plus proche.

Index.name est obligatoire quand on utilise *expressions.

fieldsLien vers cette rubrique

Index.fieldsLien vers cette définition

Une liste ou un tuple de noms de champs sur lesquels l’index doit porter.

Par défaut, les index sont créés avec un tri croissant sur chaque colonne. Pour définir un index avec un tri décroissant sur une certaine colonne, ajoutez un tiret devant le nom du champ.

Par exemple, Index(fields=['headline', '-pub_date']) créerait du SQL contenant (headline, pub_date DESC).

nameLien vers cette rubrique

Index.nameLien vers cette définition

Le nom de l’index. Si name n’est pas fourni, Django va générer automatiquement un nom. Par compatibilité avec les différentes bases de données, les noms d’index ne peuvent pas être plus longs que 30 caractères et ne doivent pas commencer par un nombre (0-9) ni par un soulignement (_).

db_tablespaceLien vers cette rubrique

Index.db_tablespaceLien vers cette définition

Le nom de l’espace de tables de base de données à utiliser pour cet index. Pour les index sur un seul champ et si db_tablespace n’est pas indiqué, l’index est créé dans l’espace db_tablespace du champ.

Si Field.db_tablespace n’est pas présent (ou si l’index utilise plusieurs champs), l’index est créé dans l’espace de tables défini dans l’option db_tablespace dans la classe Meta du modèle. Si aucun de ces espaces n’est défini, l’index est créé dans le même espace de tables que la table.

opclassesLien vers cette rubrique

Index.opclassesLien vers cette définition

Les noms des classes d’opérateurs PostgreSQL à utiliser pour cet index. Si vous nécessitez une classe d’opérateur personnalisée, vous devez en fournir une pour chaque champ de l’index.

Par exemple, GinIndex(name='json_index', fields=['jsonfield'], opclasses=['jsonb_path_ops']) crée un index gin pour le champ jsonfield en utilisant les classes d’opérateurs jsonb_path_ops.

opclasses est ignoré pour les bases de données autres que PostgreSQL.

Index.name est obligatoire quand on utilise opclasses.

conditionLien vers cette rubrique

Index.conditionLien vers cette définition

Si la table est très grande et que vos requêtes ciblent principalement un certain sous-ensemble de lignes, il peut être utile de restreindre l’index à ce sous-ensemble. Indiquez une condition sous forme de Q. Par exemple, condition=Q(pages__gt=400) va indexer les lignes dont le champ pages est plus grand que 400.

Index.name est obligatoire quand on utilise condition.

includeLien vers cette rubrique

Index.includeLien vers cette définition

Une liste ou un tuple de noms de champs à inclure dans l’index couvrant, représentant des colonnes qui ne sont pas des clés. Cela permet des analyses en index pur avec des requêtes qui ne sélectionnent que les champs inclus (include) et qui ne filtrent que sur les champs indexés (fields).

Par exemple :

Code
Index(name="covering_index", fields=["headline"], include=["pub_date"])

permettra le filtrage sur headline, sélectionnant aussi pub_date, tout en ne récupérant les données qu’à partir de l’index.

Avec include, l’index produit est plus petit qu’en utilisant un index sur plusieurs colonnes mais avec l’inconvénient que les colonnes n’étant pas des clés ne peuvent pas être utilisées pour le tri ou le filtrage.

opclasses est ignoré pour les bases de données autres que PostgreSQL.

Index.name est obligatoire quand on utilise include.

Consultez la documentation PostgreSQL pour plus de détails au sujet des index couvrants.