Estate atento ya que en esta noticia hallarás el arreglo que buscas.
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'],
crea un índice de ginebra en
opclasses=['jsonb_path_ops'])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
.
Te mostramos comentarios y calificaciones
Eres capaz de estimular nuestro estudio mostrando un comentario o puntuándolo te lo agradecemos.