Referencia del índice del modelo

Las clases de índices facilitan la creación de índices en la base de datos. Pueden agregarse utilizando la opción Meta.indexes. Este documento explica las referencias de la API de Index que incluye las opciones del índice.

Referenciando índices integrados

Los índices se definen en django.db.models.indexes, pero por conveniencia están importados en django.db.models. La convención estándar es utilizar from django.db import models y referirse a los índices como models.<IndexClass>.

Index opciones

class Index(*expressions, fields=(), name=None, db_tablespace=None, opclasses=(), condition=None, include=None)[fuente]

Crea un índice (B-Tree) en la base de datos.

expressiones

Index.expressions

El argumento posicional *expressions permite crear índices funcionales sobre expresiones y funciones de la base de datos.

Por ejemplo:

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

crea un índice en el valor lowercased del campo title en orden descendente y el campo pub_date en el orden ascendente por defecto.

Otro ejemplo:

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

crea un índice en el resultado de multiplicar los campos height y weight y el weight redondeado a la unidad más cercana.

Index.name es obligatorio cuando se utiliza *expressions.

Restricciones sobre Oracle

Oracle requiere que las funciones referenciadas en un índice estén marcadas como DETERMINISTIC. Django no valida esto pero Oracle producirá un error. Esto significa que funciones como Random() no son aceptadas.

Restricciones sobre PostgreSQL

Requiere que las funciones y operadores referenciados en un índice estén marcados como IMMUTABLE. Django no valida esto, pero PostgreSQL producirá un error. Esto significa que funciones tales como Concat() no son aceptadas.

MySQL y MariaDB

Índices funcionales se ignoran con MySQL < 8.0.13 y MariaDB ya que ninguna de ellas los soporta.

fields

Index.fields

Una lista o tupla de los nombres de los campos en los que se desea el índice.

Por defecto, se crean índices con un orden ascendente para cada columna. Para definir un índice con un orden descendente para una columna, agrega un guión antes del nombre de la campo.

Ejemplo: Index(fields=['encabezado', '-fecha_pub']) crearía SQL con (encabezado, fecha_pub DESC).

MariaDB

Índice de ordenación no está soportado en MariaDB < 10.8. En ese caso, se crea un índice descendente como un índice normal.

nombre

Index.name

El nombre del índice. Si no se proporciona el parámetro name, Django generará automáticamente un nombre. Para compatibilidad con diferentes bases de datos, los nombres de índice no pueden ser más largos que 30 caracteres y no deben comenzar con un número (0-9) o guión bajo (_).

Índices parciales en clases base abstractas

Debes especificar siempre un nombre único para un índice. Como tal, no puedes normalmente especificar un índice parcial en una clase base abstracta, ya que la opción Meta.indexes se hereda por las subclases, con exactamente los mismos valores para los atributos (incluyendo name) cada vez. Para evitar colisiones de nombres, parte del nombre puede contener '%(app_label)s' y '%(class)s', que se reemplazan, respectivamente, por el etiquetado de la aplicación en minúsculas y el nombre de la clase del modelo concreto. Por ejemplo Index(fields=['title'], name='%(app_label)s_%(class)s_title_index').

db_tablespace

Index.db_tablespace

El nombre de la espacio de nombres de base de datos ` a utilizar para este índice. Para índices de un solo campo, si no se proporciona ``db_tablespace`, el índice se crea en el db_tablespace del campo.

Si la propiedad Field.db_tablespace no está especificada (o si el índice utiliza varios campos), se crea el índice en la tabla de espacios de nombres especificada en la opción db_tablespace dentro del class Meta del modelo. Si ninguna de esas tablas de espacios de nombres están configuradas, el índice se crea en la misma tabla de espacios de nombres que la tabla.

Ver también

Para una lista de índices específicos de PostgreSQL, consulte django.contrib.postgres.indexes.

opclasses

Index.opclasses

Los nombres de las clases de operadores del PostgreSQL a utilizar para este índice. Si requiere una clase de operador personalizada, debe proporcionarla para cada campo en el índice.

Por ejemplo, GinIndex(name='json_index', fields=['jsonfield'], opclasses=['jsonb_path_ops']) crea un índice gin en jsonfield utilizando jsonb_path_ops.

Las opclasses se ignoran para bases de datos excepto PostgreSQL.

La propiedad Index.name es obligatoria cuando se utiliza opclasses.

condición

Index.condition

Si la tabla es muy grande y las consultas de su mayoría apuntan a una subconjunto de filas, puede ser útil restringir un índice a ese subconjunto. Especifique una condición como Q. Por ejemplo, condition=Q(pages__gt=400) indexa registros con más de 400 páginas.

La propiedad Index.name es obligatoria cuando se utiliza condition.

Restricciones sobre PostgreSQL

PostgreSQL requiere que las funciones referenciadas en la condición estén marcadas como INMUTABLE. Django no valida esto, pero PostgreSQL producirá un error. Esto significa que funciones como funciones de fecha y Concat no se aceptan. Si almacena fechas en DateTimeField, la comparación con objetos datetime puede requerir el argumento tzinfo para ser proporcionado porque de lo contrario la comparación podría dar lugar a una función mutable debido a la conversión que hace Django para consultas.

Restricciones en SQLite

SQLite imponen restricciones sobre cómo se puede construir un índice parcial.

Oracle

Oracle no soporta índices parciales. En su lugar, los índices parciales se pueden emular utilizando índices funcionales junto con expresiones de Case.

MySQL y MariaDB

El argumento condition es ignorado en MySQL y MariaDB ya que ninguno admite índices condicionales.

incluye

Index.include

Una lista o tupla de los nombres de los campos a incluir en el índice cubriente como columnas no clave. Esto permite utilizar escaneos solo del índice para consultas que seleccionan solo campos incluidos (include) y filtran solo por campos indexados (fields).

Por ejemplo:

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

Permitirá filtrar sobre headline, también seleccionando pub_date, mientras se obtiene la data sólo desde el índice.

Utilizar include producirá un índice más pequeño que utilizar un índice de varias columnas, pero con la desventaja de que las columnas no clave no pueden usarse para ordenar o filtrar.

include se ignora para bases de datos además de PostgreSQL.

Index.name es requerido cuando se utiliza include.

Consulte la documentación de PostgreSQL para obtener más detalles sobre índices cubriente.

Restricciones sobre PostgreSQL

PostgreSQL admite índices cubrientes B-Tree y GiST. PostgreSQL 14+ también admite índices cubrientes SP-GiST.