Справочник по индексам модели¶
Индексные классы облегчают создание индексов базы данных. Их можно добавить с помощью параметра 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
) каждый раз. Вместо этого укажите параметр 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
¶
Имена классов операторов PostgreSQL для использования в этом индексе. Если вам требуется пользовательский класс операторов, вы должны предоставить его для каждого поля в индексе.
Например, GinIndex(name='json_index', fields=['jsonfield'], opclasses=['jsonb_path_ops'])
создает джин индекс для 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, поскольку ни один из них не поддерживает условные индексы.