25

我有以下模型:

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

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

4

5 回答 5

33

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

于 2013-11-22T06:15:18.573 回答
8

从 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']),
        ]
于 2017-08-21T14:59:57.077 回答
2

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

例如,来自postgres docs

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

感谢Mark Byers的文档链接

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

class PopulationData(models.Model):
    ...

    class Meta:
        index_together = [['slot', 'sample']]
于 2020-11-17T02:41:30.173 回答
1

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

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

于 2013-04-07T18:44:20.910 回答
0

注意: index_together 将来可能会被弃用: https ://docs.djangoproject.com/en/dev/ref/models/options/#index-together

改用 Meta 类中的索引:

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'),
        ]
于 2022-02-21T13:57:08.087 回答