从Django模型创建复合索引

C2H*_*5OH 19 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'),)
Run Code Online (Sandbox Code Playgroud)

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

CREATE INDEX my_compound_index ON myapp_populationdata (slot, sample);
Run Code Online (Sandbox Code Playgroud)

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

Eug*_*kov 29

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

  • 新链接https://docs.djangoproject.com/en/1.9/ref/models/options/#index-together (3认同)

小智 5

从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']),
        ]
Run Code Online (Sandbox Code Playgroud)


Rei*_*ica 5

由于唯一约束也会创建索引,因此创建两者会适得其反。

例如,来自postgres docs

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

感谢Mark Byers提供的文档链接

如果由于某种原因您仍然想创建多列索引,您可以通过以下方式执行此操作index_together

class PopulationData(models.Model):
    ...

    class Meta:
        index_together = [['slot', 'sample']]
Run Code Online (Sandbox Code Playgroud)