Las clases de índices facilitan la creación de índices de bases de datos. Se pueden agregar usando el Meta.indexes opción. Este documento explica las referencias API de Index que incluye las opciones de índice.

Hacer referencia a índices integrados

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

Index opciones

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

Crea un índice (árbol B) en la base de datos.

expressions

Index.expressions

Nuevo en Django 3.2.

Argumento posicional *expressions permite crear índices funcionales sobre expresiones y funciones de bases de datos.

Por ejemplo:

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

crea un índice en el valor en minúsculas de la title campo en orden descendente y el pub_date campo en el orden ascendente predeterminado.

Otro ejemplo:

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

crea un índice sobre el resultado de multiplicar campos height y weight y el weight redondeado al entero más cercano.

Index.name es necesario cuando se usa *expressions.

Restricciones en Oracle

Oracle requiere que las funciones a las que se hace referencia en un índice se marquen como DETERMINISTIC. Django no valida esto, pero Oracle producirá un error. Esto significa que funciones como Random() no se aceptan.

Restricciones en PostgreSQL

PostgreSQL requiere que las funciones y operadores a los que se hace referencia en un índice se marquen como IMMUTABLE. Django no valida esto, pero PostgreSQL producirá un error. Esto significa que funciones como Concat() no se aceptan.

MySQL y MariaDB

Los índices funcionales se ignoran con MySQL <8.0.13 y MariaDB ya que ninguno los admite.

fields

Index.fields

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

De forma predeterminada, los índices se crean con un orden ascendente para cada columna. Para definir un índice con un orden descendente para una columna, agregue un guión antes del nombre del campo.

Por ejemplo Index(fields=['headline', '-pub_date']) crearía SQL con (headline, pub_date DESC). El orden de índice no es compatible con MySQL. En ese caso, se crea un índice descendente como índice normal.

name

Index.name

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

Índices parciales en clases base abstractas

Siempre debe especificar un nombre exclusivo para un índice. Como tal, normalmente no puede especificar un índice parcial en una clase base abstracta, ya que el Meta.indexes La opción es heredada por subclases, con exactamente los mismos valores para la attributes (incluso name) cada vez. Para evitar las colisiones de nombres, parte del nombre puede contener '%(app_label)s' y '%(class)s', que se reemplazan, respectivamente, por la etiqueta de la aplicación en minúsculas y el nombre de 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 espacio de tabla de base de datos utilizar para este índice. Para índices de un solo campo, si db_tablespace no se proporciona, el índice se crea en el db_tablespace en el campo.

Si Field.db_tablespace no se especifica (o si el índice utiliza varios campos), el índice se crea en el espacio de tabla especificado en el db_tablespace opción dentro de la modelo class Meta. Si no se establece ninguno de esos espacios de tabla, el índice se crea en el mismo espacio de tabla que la tabla.

Ver también

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

opclasses

Index.opclasses

Los nombres de la Clases de operador de PostgreSQL utilizar para este índice. Si necesita una clase de operador personalizada, debe proporcionar una para cada campo del índice.

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

opclasses se ignoran para bases de datos además de PostgreSQL.

Index.name es necesario cuando se usa opclasses.

condition

Index.condition

Si la tabla es muy grande y sus consultas se dirigen principalmente a un 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.

Index.name es necesario cuando se usa condition.

Restricciones en PostgreSQL

PostgreSQL requiere que las funciones a las que se hace referencia en la condición se marquen 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, comparación con datetime los objetos pueden requerir el tzinfo argumento que se proporcionará porque, de lo contrario, la comparación podría resultar en una función mutable debido a la conversión que Django hace para búsquedas.

Restricciones en SQLite

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

Oráculo

Oracle no admite índices parciales. En cambio, los índices parciales se pueden emular utilizando índices funcionales junto con Case Expresiones

MySQL y MariaDB

los condition El argumento se ignora con MySQL y MariaDB ya que ninguno admite índices condicionales.

include

Index.include

Nuevo en Django 3.2.

Una lista o tupla de los nombres de los campos que se incluirán en el índice de cobertura como nokey columnas. Esto permite que los escaneos de solo índice se utilicen para consultas que seleccionan solo campos incluidos (include) y filtrar solo por campos indexados (fields).

Por ejemplo:

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

permitirá filtrar en headline, también seleccionando pub_date, mientras se obtienen datos solo del índice.

Utilizando include producirá un índice más pequeño que el uso de un índice de columnas múltiples, pero con el inconveniente de que nokey las columnas no se pueden utilizar para ordenar o filtrar.

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

Index.name es necesario cuando se usa include.

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

Restricciones en PostgreSQL

PostgreSQL 11+ solo admite la cobertura de índices B-Tree, y PostgreSQL 12+ también admite la cobertura GiST indexes.