Django: подразумевает ли unique_together db_index = True так же, как ForeignKey? - PullRequest
18 голосов
/ 20 октября 2011

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

Ответы [ 5 ]

17 голосов
/ 08 марта 2017

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

12 голосов
/ 20 октября 2011

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

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

5 голосов
/ 08 мая 2014

В 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'
1 голос
/ 22 мая 2019

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

1 голос
/ 20 октября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...