mysql - existente - Django: crear índice: columna única no única
django mysql (5)
A partir de Django 1.5, puede usar la opción Meta.index_together
:
class QuoteModel(models.Model):
# ... fields ...
class Meta:
index_together = [
("sequence", "stock"),
]
(nota: la respuesta original de 2009 dijo que no era posible indexar múltiples campos, sino que ha sido reemplazado)
Dado el siguiente modelo, quiero indexar los campos (secuencia, stock)
class QuoteModel(models.Model):
quotedate = models.DateField()
high = models.FloatField() #(9,2) DEFAULT NULL,
low = models.FloatField() #(9,2) DEFAULT NULL,
close = models.FloatField() #(9,2) DEFAULT NULL,
closeadj = models.FloatField() #(9,2) DEFAULT NULL,
volume = models.IntegerField() #(9,2) DEFAULT NULL,
stock = models.IntegerField(db_index=True) #(9,2) DEFAULT NULL,
open = models.FloatField() #(9,2) DEFAULT NULL,
sequence = models.IntegerField() #(9,2) DEFAULT NULL,
Este índice no debe ser exclusivo, en mysql debe ser algo así como:
create index ndx_1 on model_quotemodel(sequence,stock);
La única solución de Django que conozco es crear un archivo "sql" que será ejecutado por django luego de la creación de la tabla. Entonces, creé un "stockmodel.sql" que contenía la siguiente consulta (igual que la anterior :)
create index ndx_1 on model_quotemodel(sequence,stock);
¿Hay alguna manera "más limpia" de hacerlo?
Es index_together en django 1.5
Mira aquí https://docs.djangoproject.com/en/dev/ref/models/options/#index-together
Hay un boleto para esta característica. Eche un vistazo http://code.djangoproject.com/ticket/5805
Puede aplicar el parche de este boleto usted mismo.
ACTUALIZAR
Ahora está en Django: https://docs.djangoproject.com/en/1.5/ref/models/options/#django.db.models.Options.index_together
Para seguir con la respuesta aceptada, si está usando South , puede agregar fácilmente una clave compuesta de la siguiente manera:
manage.py schemamigration your_app_name name_for_migration --add-index ModelName.first_field_in_index
Luego puede editar el archivo de migración generado para agregar los campos adicionales en el índice único (verá que es solo una lista de los nombres de campo que se necesitan).
No se olvide de actualizar la migración inversa así como la anterior.
unique_together
podría ser lo que estás buscando. Solo ponlo en tu clase Meta
dentro de tu modelo.