Pregunta

Un campo en un modelo, foo = models.ForeignKey(Foo) agregará automáticamente un índice de base de datos para la columna, para agilizar las búsquedas.Eso está muy bien, pero los documentos de Django no indican si los campos en un modelo-meta unique_together recibir el mismo trato.Resulta que tengo un modelo en el que un campo de caracteres que figura en unique_together requiere un índice para búsquedas rápidas.Sé que no hará ningún daño agregar un duplicado. db_index=True en la definición del campo, pero tengo curiosidad.

¿Fue útil?

Solución

unique_together no agrega automáticamente índices para cada campo incluido en la lista.

Las nuevas versiones de Django sugieren usar metaopciones de índice y restricción en su lugar:

https://docs.djangoproject.com/en/2.2/ref/models/options/#unique-together

https://docs.djangoproject.com/en/2.2/ref/models/options/#index-together

Otros consejos

Para cualquiera que venga aquí y se pregunte si necesita un index_together además de unique_together Para obtener el beneficio de rendimiento del índice, la respuesta para Postgres es No, ellos son funcionalmente igual.

Si unique_together agrega un índice, será un índice de múltiples columnas.

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 superior, puedes usar el {Model}.Meta.index_together atributo de clase.Si tuviera dos campos nombrados foo y bar, agregarías:

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 aplique a index_together.

Esto también estaría bien:

class Meta(object):
    unique_together = 'foo', 'bar'
    index_together = [
        ['foo', 'bar']
    ]

Esto, sin embargo, es NO respaldado por la documentación:

class Meta(object):
    unique_together = 'foo', 'bar'
    index_together = 'foo', 'bar'

De acuerdo a los documentos, solo impondrá la unicidad 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 puedes simplemente verificar en el nivel de base de datos si el índice existe.Todo indica aunque no es así.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top