【问题标题】:Django: create Index: non-unique, multiple columnDjango:创建索引:非唯一,多列
【发布时间】: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);

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

【问题讨论】:

    标签: mysql django indexing


    【解决方案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

            【讨论】:

              猜你喜欢
              • 2021-10-30
              • 2017-02-28
              • 1970-01-01
              • 2016-01-15
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-10-01
              相关资源
              最近更新 更多