Создание составного индекса из модели Django

у меня есть следующие модели:

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

3 ответов


начиная с django-1.5 вы можете сделать составной индекс, используя опцию index_together meta: https://docs.djangoproject.com/en/dev/ref/models/options/#index-together


Я думаю, что в настоящее время это не реализовано в Django ORM.

Если вы используете инструмент миграции (например, Юг), который может быть хорошим местом для добавления этого оператора sql или если вы предпочитаете избегать raw sql, вы можете использовать sqlalchemy (core), но этот случай звучит достаточно просто, чтобы просто пойти с sql.


начиная с Django-1.11 используйте Meta.индексирует опцию 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']),
        ]