Справочник по индексам моделей
Классы индексов облегчают создание индексов в базе данных. Их можно добавить, используя опцию Meta.indexes. В этом документе описаны API-справочники Index, включая опции индекса опции индексов.
Использование встроенных индексов
Индексы определены в 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-дерево) в базе данных.
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 не поддерживает частичные индексы. Вместо этого частичные индексы можно эмулировать с помощью функциональных индексов. Используйте миграцию, чтобы добавить индекс с помощью RunSQL.
MySQL и MariaDB
Аргумент condition игнорируется в MySQL и MariaDB, так как ни одна из баз данных не поддерживает условные индексы.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/3.0/ref/models/indexes/