Django:创建索引:非唯一,多列

时间:2009-10-16 13:53:53

标签: mysql django indexing

鉴于以下模型,我想索引字段(序列,库存)

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解决方法是创建一个“sql”文件,该文件将在创建表时由django执行。所以,我创建了一个包含以下查询的“stockmodel.sql”(与上面相同:)

create index ndx_1 on model_quotemodel(sequence,stock);

有没有“更干净”的方式呢?

7 个答案:

答案 0 :(得分:21)

此功能有一张票。看看http://code.djangoproject.com/ticket/5805

您可以自行应用此故障单中的补丁。

<强>更新

现在在Django:https://docs.djangoproject.com/en/1.5/ref/models/options/#django.db.models.Options.index_together

答案 1 :(得分:16)

从Django 1.5开始,您可以使用Meta.index_together option

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

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

(注意:2009年的原始答案说不可能索引多个字段;它已被替换)

答案 2 :(得分:15)

要接受已接受的答案,如果您使用South,则可以轻松添加复合键,如下所示:

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

然后,您可以编辑生成的迁移文件,将其他字段添加到一个索引中(您将看到它只是一个需要的字段名称列表)。

不要忘记更新反向迁移以及前向迁移。

答案 3 :(得分:14)

django 1.5中的index_together

请参阅此处https://docs.djangoproject.com/en/dev/ref/models/options/#index-together

答案 4 :(得分:10)

unique_together可能就是你要找的东西。只需将其放入模型中的Meta课程中即可。

答案 5 :(得分:1)

将来可能不推荐使用 index_together 功能。

您应该使用indexes选项,而不要使用 index_together

索引选项的示例:

from django.db import models

class Customer(models.Model):
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)

    class Meta:
        indexes = [
            models.Index(fields=['last_name', 'first_name']),
            models.Index(fields=['first_name'], name='first_name_idx'),
        ]

答案 6 :(得分:0)

我只是想补充一点,从Django 1.11开始,有一个新功能Options.indexes,它将允许您指定要创建的索引:

Django Options.indexes