2009-10-16 13 views
23

Dato il seguente modello, voglio indicizzare i campi (sequenza, fotografia)Django: creare indice: non univoco, a più colonne

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, 

Tale indice dovrebbe essere non univoco - in mysql dovrebbe essere qualcosa di simile:

create index ndx_1 on model_quotemodel(sequence,stock); 

L'unica soluzione Django che conosco è la creazione di un file "SQL" che verrà eseguito da Django al momento della creazione della tabella. Così, ho creato un "stockmodel.sql" che contiene la seguente query (come sopra :)

create index ndx_1 on model_quotemodel(sequence,stock); 

C'è un modo "pulito" di farlo?

risposta

13

Come di Django 1.5, è possibile utilizzare il Meta.index_together option:

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

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

(nota: la risposta originale a partire dal 2009, ha detto che non era possibile indicizzare più campi, ma è stato poi sostituito)

+2

Non sono sicuro se questa risposta si rivolge veramente chiavi composte chiave non primarie? Non sembra. –

+2

Questo non è affatto ciò che la domanda sta cercando. bisogno di chiavi composite non univoche, non primarie. – Fydo

+0

Non penso che i commenti sopra siano rilevanti per la risposta attuale ... sembra dai documenti che 'index_together' _does_ fornisce indice composito non univoco, non primario – Anentropic

9

unique_together potrebbe essere quello che stai cercando. Inseriscilo nella classe Meta all'interno del modello.

+1

Perché sono stato votato? Cosa c'è che non va? – craesh

+5

ha chiesto index_together. gli hai detto unique_together. non quello che ha chiesto. –

+0

ok, vedo, mi dispiace – craesh

15

far seguito la risposta accettata, se si utilizza South, è possibile aggiungere facilmente una chiave composta come segue:

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

È quindi possibile modificare la migrazione generata file per aggiungere i campi aggiuntivi nell'unico indice (vedrai che è solo un elenco di nomi di campo necessari).

Non dimenticare di aggiornare la migrazione inversa oltre a quella in avanti.

+0

Bravo. Grazie! –

Problemi correlati