Django: означает ли unique вместе DB index=True так же, как и ForeignKey?

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

4 ответов


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

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


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


на в Django 1.5 и выше можно использовать {Model}.Meta.index_together атрибут class. Если бы у вас было два поля с именем 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'

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