Django: подразумевает ли unique_together db_index=True так же, как ForeignKey?

Поле на модели, foo = models.ForeignKey(Foo) автоматически добавит индекс базы данных для столбца, чтобы ускорить поиск. Это хорошо и хорошо, но в документах Django не указано, есть ли поля в мета-модели модели. unique_together получить такое же лечение. У меня есть модель, в которой одно символьное поле указано в unique_together требуется индекс для быстрого поиска. Я знаю, что добавление дубликата не повредит db_index=True в определении поля, но мне любопытно.

4 ответа

Решение

Если unique_together действительно добавляет индекс, это будет индекс из нескольких столбцов.

Если вы хотите, чтобы один из столбцов был проиндексирован индивидуально, я считаю, что вам нужно указать db_index=True в определении поля.

Для тех, кто приезжает сюда, интересно, нужно ли им index_together в дополнение к unique_together Чтобы получить выигрыш в производительности индекса, ответ для Postgres - нет, они функционально одинаковы.

unique_together не добавляет автоматически индексы для каждого поля, включенного в список.

Новые версии Django предлагают вместо этого использовать мета-параметры Index & constraint:

https://docs.djangoproject.com/en/2.2/ref/models/options/

https://docs.djangoproject.com/en/2.2/ref/models/options/

В Django 1.5 и выше вы можете использовать {Model}.Meta.index_together атрибут класса. Если у вас было два поля с именем foo а также bar, вы бы добавили:

class Meta(object):
    index_together = unique_together = [
        ['foo', 'bar']
    ]

Если у вас есть только один набор уникальных полей, вы можете использовать одномерные итерации для unique_together, Тем не менее, документация не указывает, что то же самое относится к index_together,

Это также было бы хорошо:

class Meta(object):
    unique_together = 'foo', 'bar'
    index_together = [
        ['foo', 'bar']
    ]

Это, однако, НЕ подтверждается документацией:

class Meta(object):
    unique_together = 'foo', 'bar'
    index_together = 'foo', 'bar'

Согласно документам, он будет обеспечивать уникальность только на уровне базы данных. Я думаю, что в целом создание уникального поля не означает, что оно имеет индекс. Хотя вы также можете просто проверить на уровне БД, существует ли индекс. Все указывает, хотя это не так.

Другие вопросы по тегам