Справочный индекс модели¶
Классы индексов упрощают создание индексов базы данных. Их можно добавить с помощью опции Meta.indexes. В этом документе объясняются ссылки на API Index, который включает в себя index options.
Ссылки на встроенные индексы
Индексы определены в django.db.models.indexes, но для удобства они импортированы в django.db.models. Стандартным соглашением является использование моделей импорта из django.db и обращение к индексам как модели.<IndexClass>.
Опции Индекс¶
- class Index(fields=(), name=None, db_tablespace=None, opclasses=(), condition=None)¶
Создает индекс (B-дерево) в базе данных.
fields¶
- Index.fields¶
Список или кортеж имен полей, для которых требуется индекс.
По умолчанию индексы создаются в порядке возрастания для каждого столбца. Чтобы определить индекс в порядке убывания для столбца, добавьте дефис перед именем поля.
For example Index(fields=['headline', '-pub_date']) would create SQL with
(headline, pub_date DESC). Index ordering isn’t supported on MySQL. In that
case, a descending index is created as a normal index.
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').
Interpolation of '%(app_label)s' and '%(class)s' was added.
db_tablespace¶
- 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', поля=['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 выполняет для lookups.
Ограничения на SQLite
SQLite накладывает ограничения на способ построения частичного индекса.
Оракул
Oracle does not support partial indexes. Instead, partial indexes can be
emulated using functional indexes. Use a migration to add the index using RunSQL.
MySQL и МарияДБ
Аргумент condition игнорируется MySQL и MariaDB, поскольку ни одна из них не поддерживает условные индексы.