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

Posted

技术标签:

【中文标题】Django:创建索引:非唯一,多列【英文标题】:Django: create Index: non-unique, multiple column 【发布时间】:2010-12-07 09:13:22 【问题描述】:

给定以下模型,我想索引字段(序列,股票)

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);

有没有“更清洁”的方法?

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

我不确定这个答案是否真的解决了非主键复合键?好像没有。 这根本不是问题所要寻找的。需要非唯一、非主、复合键。 我不认为上面的 cmets 与当前的答案相关......从文档看来,index_together 确实 提供了非唯一的、非主要的综合指数 2020 年更新:indexes.【参考方案2】:

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

您可以自己应用此票证中的补丁。

更新

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

【讨论】:

【参考方案3】:

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

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

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

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

【讨论】:

【参考方案4】:

在 django 1.5 中是 index_together

请看这里https://docs.djangoproject.com/en/dev/ref/models/options/#index-together

【讨论】:

【参考方案5】:

unique_together 可能是您正在寻找的。只需将其放在模型中的 Meta 类中即可。

【讨论】:

他要求 index_together。你告诉他unique_together。不是他问的。 虽然这不是这个问题的答案,但这有助于我准确搜索多列唯一索引。所以,还是谢谢 是的,我想“唯一索引”和“唯一约束”之间有点混淆。无论如何,我发现这个问题也在寻找唯一约束。+1【参考方案6】:

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'),
        ]

【讨论】:

【参考方案7】:

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

Django Options.indexes

【讨论】:

以上是关于Django:创建索引:非唯一,多列的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 5.0 索引 - 唯一与非唯一

创建唯一索引似乎失败了,但是还是创建了吗?

非唯一主索引的使用

SQL- 基础知识梳理 - 索引

Postgresql:适用于(时间戳,字符串)的多列索引

SQL SERVER数据库 唯一索引 非唯一索引 聚集索引 非聚集索引 之间区别