2009-10-16 19 views
23

Dado el siguiente modelo, quiero índice de los campos (secuencia, las acciones)Django: crear Índice: no único, de varias columnas

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 debe ser no singular - en MySQL debería ser algo así como:

create index ndx_1 on model_quotemodel(sequence,stock); 

La única solución que conozco Django está creando un archivo "sql" que será ejecutado por Django sobre la creación de tablas. Por lo tanto, he creado un "stockmodel.sql" que contiene la siguiente consulta (igual que el anterior :)

create index ndx_1 on model_quotemodel(sequence,stock); 

¿Hay alguna manera "limpia" de hacerlo?

Respuesta

13

A partir de Django 1.5, puede utilizar la Meta.index_together option:

class QuoteModel(models.Model): 
    # ... fields ... 

    class Meta: 
     index_together = [ 
      ("sequence", "stock"), 
     ] 

(nota: la respuesta original a partir de 2009 dijo que no era posible índice de varios campos, sino que desde entonces ha sido sustituido)

+2

No estoy seguro de si esta respuesta realmente aborda las claves compuestas clave no primarios? Parece que no. –

+2

Esto no es para nada lo que la pregunta está buscando. necesita claves compuestas no únicas, no primarias. – Fydo

+0

No creo que los comentarios anteriores son relevantes para la respuesta actual ... parece que a partir de los documentos 'index_together' _does_ proporcionan no único, índice compuesto no primaria – Anentropic

9

unique_together puede ser lo que estás buscando. Solo colóquelo en su clase Meta dentro de su modelo.

+1

Por qué he sido rechazada? ¿Qué pasa? – craesh

+5

preguntó por index_together. le dijiste unique_together. no lo que él pidió. –

+0

bien, veo, siento – craesh

15

Para una continuación de la respuesta aceptada, si está utilizando South, puede agregar fácilmente una clave compuesta de la siguiente manera:

gestionar .py schemamigration your_app_name name_for_migration --add-index ModelName.first_field_in_index

Puede editar la migración generada archivo 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 a la inversa, así como la de proa.

+0

Bravo. ¡Gracias! –

Cuestiones relacionadas