从Django模型创建复合索引

时间:2013-04-07 18:24:30

标签: python django django-models

我有以下型号:

from django.db import models

class PopulationData(models.Model):
    slot = models.IntegerField(db_index=True)
    sample = models.IntegerField()
    value = models.FloatField()

    class Meta:
        unique_together = (('slot', 'sample'),)

我想在列对上创建一个具有UNIQUE约束的复合索引,如下所示:

CREATE INDEX my_compound_index ON myapp_populationdata (slot, sample);

现在我有一个单独的代码连接到发出前一个SQL语句的post_syncdb信号。有没有办法从模型规范中指出它? (注意:我使用的是1.3分支)。

4 个答案:

答案 0 :(得分:26)

从django-1.5开始,您可以使用index_together元选项创建复合索引: https://docs.djangoproject.com/en/dev/ref/models/options/#index-together

答案 1 :(得分:4)

从Django-1.11开始使用Meta.indexes选项https://docs.djangoproject.com/en/1.11/ref/models/indexes/

from django.db import models

class PopulationData(models.Model):
    slot = models.IntegerField(db_index=True)
    sample = models.IntegerField()
    value = models.FloatField()

    class Meta:
        unique_together = (('slot', 'sample'),)
        indexes = [
            models.Index(fields=['slot', 'sample']),
        ]

答案 2 :(得分:1)

我认为目前还没有在django ORM中实现。

如果您使用迁移工具(如南)可能是添加该sql语句的好地方,或者如果您想避免使用原始sql,则可以使用sqlalchemy(核心),但这种情况听起来很简单,只需要使用sql

答案 3 :(得分:0)

由于唯一约束还会创建索引,因此创建这两个索引将适得其反

例如,来自 postgres docs

无需在唯一列上手动创建索引;这样做只会复制自动创建的索引。

为文档链接贷记Mark Byers

如果出于某些原因您仍然想要创建多列索引,则可以通过scores.computeIfPresent("you"){ _, v -> v + 2 } 来完成:

index_together