Модель индекс ссылки
Классы индексов облегчают создание индексов баз данных. Их можно добавить, используя опцию Meta.indexes. В этом документе объясняются API-ссылки Index, который включает опции индекса Index.
Ссылка на встроенные индексы
Индексы определены в django.db.models.indexes, но для удобства они импортированы в django.db.models. Стандартная конвенция — использовать from django.db import models и ссылаться на индексы как на models.<IndexClass>.
Опции индекса
-
class Index(fields=(), name=None, db_tablespace=None, opclasses=(), condition=None)[source] -
Создает индекс (B-Tree) в базе данных.
Поля
-
Index.fields
Список или кортеж имен полей, по которым требуется индекс.
По умолчанию индексы создаются с возрастающим порядком для каждого столбца. Чтобы определить индекс с убывающим порядком для столбца, добавьте тире перед именем поля.
Например, Index(fields=['headline', '-pub_date']) создаст SQL с (headline, pub_date DESC). Порядок индексов не поддерживается в MySQL. В этом случае убывающий индекс создается как обычный индекс.
Старые версии не принимают кортеж.
Имя
-
Index.name
Имя индекса. Если name не указано, Django сгенерирует имя автоматически. Для совместимости с различными базами данных имена индексов не должны быть длиннее 30 символов и не должны начинаться с цифры (0-9) или подчёркивания (_).
Частичные индексы в абстрактных базовых классах
Вы всегда должны указывать уникальное имя для индекса. Таким образом, вы обычно не можете указать частичный индекс в абстрактном базовом классе, так как опция Meta.indexes наследуется подклассами, со значениями атрибутов (включая name) каждый раз. Вместо этого укажите опцию indexes напрямую на подклассах, указав уникальное имя для каждого индекса.
Пространство имен таблиц БД
-
Index.db_tablespace
Имя пространства имен таблиц базы данных для использования с этим индексом. Для индексов из одного поля, если db_tablespace не указано, индекс создается в db_tablespace поля.
Если Field.db_tablespace не указано (или если индекс использует несколько полей), индекс создается в пространстве имен таблиц, указанном в опции db_tablespace в class Meta модели. Если ни одно из этих пространств имен таблиц не установлено, индекс создается в том же пространстве имен таблиц, что и таблица.
См. также
Список PostgreSQL-специфичных индексов см. в django.contrib.postgres.indexes.
Операционные классы
-
Index.opclasses
Имена PostgreSQL операторных классов для использования с этим индексом. Если вам требуется пользовательский операторный класс, вы должны предоставить один для каждого поля в индексе.
Например, GinIndex(name='json_index', fields=['jsonfield'],
opclasses=['jsonb_path_ops']) создает индекс gin на jsonfield с использованием jsonb_path_ops.
opclasses игнорируются для баз данных, отличных от PostgreSQL.
Index.name требуется при использовании opclasses.
Условие
-
Index.condition
Если таблица очень большая, а ваши запросы в основном ориентированы на подмножество строк, может быть полезно ограничить индекс этим подмножеством. Укажите условие как Q. Например, condition=Q(pages__gt=400) индексирует записи с более чем 400 страницами.
Index.name требуется при использовании condition.
Ограничения для PostgreSQL
PostgreSQL требует, чтобы функции, указанные в условии, были помечены как IMMUTABLE. Django не проверяет это, но PostgreSQL выдаст ошибку. Это означает, что такие функции, как Дата функции и Concat, не принимаются. Если вы храните даты в DateTimeField, сравнение с datetime объектами может потребовать аргумента tzinfo, иначе сравнение может привести к мутабельной функции из-за преобразования, которое Django выполняет для поисков.
Ограничения для SQLite
SQLite накладывает ограничения на то, как можно построить частичный индекс.
Oracle
Oracle не поддерживает частичные индексы. Вместо этого частичные индексы можно эмулировать с помощью функциональных индексов. Используйте миграцию для добавления индекса с помощью RunSQL.
MySQL и MariaDB
Аргумент condition игнорируется в MySQL и MariaDB, так как ни одна из баз данных не поддерживает условные индексы.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/2.2/ref/models/indexes/