python - Django: ¿unique_together implica que db_index=True de la misma forma que lo hace ForeignKey?
django-models database-indexes (4)
De acuerdo con los documentos , solo aplicará la exclusividad en el nivel de la base de datos. Creo que, en general, hacer que un campo sea único no implica que tenga un índice. Aunque también podrías simplemente verificar el nivel de db si el índice existe. Todo indica, aunque no es así.
Un campo en un modelo, foo = models.ForeignKey(Foo)
agregará automáticamente un índice de base de datos para la columna, con el fin de hacer búsquedas más rápidas. Eso está bien y bien, pero los documentos de Django no indican si los campos de un modelo unique_together
de meta reciben el mismo tratamiento. Tengo un modelo en el que un campo char que se enumera en unique_together
requiere un índice para búsquedas rápidas. Sé que no va a doler nada agregar un duplicado db_index=True
en la definición del campo, pero tengo curiosidad.
Si unique_together
agrega un índice, será un índice de columna múltiple.
Si desea que una de las columnas se indexe individualmente, creo que debe especificar db_index=True
en la definición del campo.
En Django 1.5 y {Model}.Meta.index_together
posteriores , puede usar el atributo de clase {Model}.Meta.index_together
. Si tuviera dos campos llamados foo
y bar
, debería agregar:
class Meta(object):
index_together = unique_together = [
[''foo'', ''bar'']
]
Si solo tiene un conjunto de campos únicos, puede usar un iterable unidimensional para unique_together
. Sin embargo, la documentación no indica que lo mismo se aplica a index_together
.
Esto también estaría bien:
class Meta(object):
unique_together = ''foo'', ''bar''
index_together = [
[''foo'', ''bar'']
]
Esto, sin embargo, NO es compatible con la documentación:
class Meta(object):
unique_together = ''foo'', ''bar''
index_together = ''foo'', ''bar''
Para cualquiera que venga aquí preguntándose si necesita un index_together
además de unique_together
para obtener el beneficio de rendimiento del índice, la respuesta para Postgres es no , son funcionalmente iguales.