Справочник по индексам модели

Индексные классы облегчают создание индексов базы данных. Их можно добавить с помощью параметра 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. В этом случае нисходящий индекс создается как обычный индекс.

Changed in Django 2.1:

Старые версии не принимают кортеж.

name

Index.name

Название индекса. Если name не указано, Django автоматически сгенерирует имя. Для совместимости с различными базами данных имена индексов не могут быть длиннее 30 символов и не должны начинаться с цифры (0-9) или подчеркивания (_).

Частичные индексы в абстрактных базовых классах

Вы всегда должны указывать уникальное имя для индекса. Таким образом, вы не можете обычно указывать частичный индекс для абстрактного базового класса, так как опция Meta.indexes наследуется подклассами, с точно такими же значениями для атрибутов (включая name) каждый раз. Вместо этого укажите параметр indexes непосредственно для подклассов, указав уникальное имя для каждого индекса.

db_tablespace

Index.db_tablespace

Имя табличного пространства базы данных для использования в этом индексе. Для индексов с одним полем, если db_tablespace не указан, индекс создается в db_tablespace поля.

Если Field.db_tablespace не указан (или если индекс использует несколько полей), индекс создается в табличном пространстве, указанном в параметре db_tablespace внутри class Meta модели. Если ни одно из этих табличных пространств не задано, индекс создается в том же табличном пространстве, что и таблица.

См.также

Список специфичных для PostgreSQL индексов см. в разделе django.contrib.postgres.indexes.

opclasses

Index.opclasses
New in Django 2.2.

Имена классов операторов PostgreSQL для использования в этом индексе. Если вам требуется пользовательский класс операторов, вы должны предоставить его для каждого поля в индексе.

Например, GinIndex(name='json_index', fields=['jsonfield'], opclasses=['jsonb_path_ops']) создает джин индекс для jsonfield, используя jsonb_path_ops.

opclasses игнорируются для всех баз данных, кроме PostgreSQL.

Index.name требуется при использовании opclasses.

condition

Index.condition
New in Django 2.2.

Если таблица очень большая и ваши запросы в основном нацелены на подмножество строк, может быть полезно ограничить индекс этим подмножеством. Укажите условие как 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, поскольку ни один из них не поддерживает условные индексы.

Вернуться на верх