2009-10-16 79 views
23

考慮下面的模型,我想索引的字段(序列,股吧)Django的:CREATE INDEX:非唯一,多列

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, 

該指數應該是不唯一的 - 在MySQL它應該是是這樣的:

create index ndx_1 on model_quotemodel(sequence,stock); 

唯一的解決辦法Django的我所知道的是創建將由Django的在創建表執行的「SQL」的文件。所以,我創建了一個「stockmodel.sql」包含以下查詢(同上:)

create index ndx_1 on model_quotemodel(sequence,stock); 

有沒有做這件事的任何「乾淨」的方式?

回答

13

由於Django的1.5,你可以使用Meta.index_together option

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

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

(注:從2009年最初的回答說,這是不可能的索引多個字段,它已被取代)

+2

我不知道這答案真的解決了非主鍵組合鍵?似乎沒有。 – 2011-03-16 00:05:59

+2

這完全不是問題所在。需要非唯一的,非主要的組合鍵。 – Fydo 2013-10-30 23:48:21

+0

我不認爲上面的評論與當前的答案有關......從文檔看來,'index_together' _does_提供了非唯一的,非主要的綜合索引 – Anentropic 2017-07-24 12:48:53

9

unique_together可能是你正在尋找的。只需將它放入模型中的Meta類。

+1

爲什麼我被拒絕了?怎麼了? – craesh 2010-11-11 13:02:00

+5

他要求index_together。你告訴他unique_together。不是他所問的。 – 2011-01-31 12:21:50

+0

好吧,我明白了,對不起 – craesh 2011-03-31 11:10:03

15

要接受的答案,遵循如果您正在使用South,你可以輕鬆地添加組合鍵如下:

管理.py schemamigration your_app_name name_for_migration --add-index ModelName.first_field_in_index

然後,您可以編輯生成的遷移文件將附加字段添加到一個索引中(您會看到它只是需要的字段名稱列表)。

不要忘記更新反向遷移以及向前遷移。

+0

布拉沃。謝謝! – 2013-04-19 21:41:18