Подтвердить что ты не робот

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

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

4b9b3361

Ответ 2

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

Ответ 3

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

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

Ответ 4

В Django 1.5 и выше вы можете использовать {Model}.Meta.index_together класса {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'

Ответ 5

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