Справочник индексов моделей
Классы индексов облегчают создание баз данных индексов. Их можно добавить, используя опцию Meta.indexes. Этот документ объясняет API-справочник Index, который включает опции индексов index options.
Использование встроенных индексов
Индексы определены в django.db.models.indexes, но для удобства импортированы в django.db.models. Стандартная конвенция заключается в использовании from django.db import models и ссылке на индексы как на models.<IndexClass>.
Index опции
-
class Index(fields=(), name=None, db_tablespace=None, opclasses=(), condition=None) -
Создает индекс (B-Tree) в базе данных.
fields
-
Index.fields
Список или кортеж имен полей, по которым требуется создать индекс.
По умолчанию индексы создаются с возрастающим порядком для каждого столбца. Чтобы определить индекс с убывающим порядком для столбца, добавьте тире перед именем поля.
Например, Index(fields=['headline', '-pub_date']) создаст SQL с (headline, pub_date DESC). Порядок индексов не поддерживается в MySQL. В этом случае индекс с убывающим порядком создается как обычный индекс.
name
-
Index.name
Имя индекса. Если name не указано, Django автоматически сгенерирует имя. Для совместимости с разными базами данных, имена индексов не могут быть длиннее 30 символов и не должны начинаться с цифры (0-9) или символа подчеркивания (_).
Частичные индексы в абстрактных базовых классах
Вы всегда должны указывать уникальное имя для индекса. Поэтому, обычно нельзя указывать частичный индекс для абстрактного базового класса, так как опция Meta.indexes наследуется подклассами, с абсолютно одинаковыми значениями атрибутов (включая name) каждый раз. Чтобы обойти коллизии имен, часть имени может содержать '%(app_label)s' и '%(class)s', которые заменяются соответственно строчным именем приложения и именем класса конкретной модели. Например Index(fields=['title'],
name='%(app_label)s_%(class)s_title_index').
Добавлена интерполяция '%(app_label)s' и '%(class)s'.
db_tablespace
-
Index.db_tablespace
Имя пространства таблиц базы данных для использования с этим индексом. Для индексов по одному полю, если db_tablespace не указано, индекс создаётся в db_tablespace поля.
Если Field.db_tablespace не указано (или если индекс использует несколько полей), индекс создаётся в пространстве таблиц, указанном в опции db_tablespace внутри модели class Meta. Если ни одна из этих опций не указана, индекс создаётся в том же пространстве таблиц, что и таблица.
См. также
Список PostgreSQL-специфичных индексов см. в django.contrib.postgres.indexes.
opclasses
-
Index.opclasses
Имена PostgreSQL операторных классов для использования с этим индексом. Если вам требуется пользовательский операторный класс, вы должны указать его для каждого поля в индексе.
Например, GinIndex(name='json_index', fields=['jsonfield'],
opclasses=['jsonb_path_ops']) создаёт индекс gin на jsonfield с помощью jsonb_path_ops.
opclasses игнорируются для баз данных, кроме PostgreSQL.
Index.name требуется при использовании opclasses.
condition
-
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 не поддерживает частичные индексы. Вместо этого частичные индексы можно эмулировать, используя функциональные индексы. Используйте миграцию migration для добавления индекса с помощью RunSQL.
MySQL и MariaDB
Аргумент condition игнорируется в MySQL и MariaDB, так как ни одна из них не поддерживает условные индексы.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/3.1/ref/models/indexes/