2009-10-16 42 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