Поле на модели, foo = models.ForeignKey(Foo)
автоматически добавит индекс базы данных для столбца, чтобы ускорить поиск. Это хорошо и хорошо, но Django docs не указывают, получают ли поля в model-meta unique_together
одинаковое обращение. У меня, случается, есть модель, в которой одно поле char, указанное в unique_together
, требует индекса для быстрого поиска. Я знаю, что ничего не помешает добавить дубликат db_index=True
в определение поля, но мне интересно.
Django: Does unique_together подразумевает db_index = True так же, как делает ForeignKey?
Ответ 1
unique_together
не добавляет автоматически индексы для каждого поля, включенного в список.
Новые версии Django предлагают вместо этого использовать мета-параметры Index & constraint:
https://docs.djangoproject.com/en/2.2/ref/models/options/#unique-together
https://docs.djangoproject.com/en/2.2/ref/models/options/#index-together
Ответ 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, если индекс существует. Все указывает, хотя это не так.