Справочник по индексам моделей
Классы индексов упрощают создание индексов баз данных. Их можно добавить, используя опцию Meta.indexes. В этом документе объясняются API-справочные материалы Index, которые включают опции индексов опции индекса.
Ссылка на встроенные индексы
Индексы определены в django.db.models.indexes, но для удобства они импортированы в django.db.models. Стандартная конвенция заключается в использовании from django.db import models и ссылке на индексы как на models.<IndexClass>.
Index опции
-
class Index(*expressions, fields=(), name=None, db_tablespace=None, opclasses=(), condition=None, include=None) -
Создаёт индекс (B-дерево) в базе данных.
expressions
-
Index.expressions
Позиционный аргумент *expressions позволяет создавать функциональные индексы по выражениям и функциям базы данных.
Например:
Index(Lower("title").desc(), "pub_date", name="lower_title_date_idx")
создаёт индекс по значению поля title в нижнем регистре в порядке убывания и поле pub_date в порядке возрастания по умолчанию.
Другой пример:
Index(F("height") * F("weight"), Round("weight"), name="calc_idx")
создаёт индекс по результату умножения полей height и weight и поле weight, округлённое до ближайшего целого числа.
Index.name требуется при использовании *expressions.
Ограничения для Oracle
Oracle требует, чтобы функции, на которые ссылается индекс, были помечены как DETERMINISTIC. Django не проверяет это, но Oracle выдаст ошибку. Это означает, что такие функции, как Random(), не поддерживаются.
Ограничения для PostgreSQL
PostgreSQL требует, чтобы функции и операторы, на которые ссылается индекс, были помечены как IMMUTABLE. Django не проверяет это, но PostgreSQL выдаст ошибку. Это означает, что такие функции, как Concat(), не поддерживаются.
MySQL и MariaDB
Функциональные индексы игнорируются в MySQL < 8.0.13 и MariaDB, так как они их не поддерживают.
fields
-
Index.fields
Список или кортеж имён полей, по которым требуется создать индекс.
По умолчанию индексы создаются с возрастающим порядком для каждого столбца. Чтобы определить индекс с убывающим порядком для столбца, добавьте тире перед именем поля.
Например, Index(fields=['headline', '-pub_date']) создаст SQL с (headline, pub_date DESC).
MariaDB
Порядок сортировки индекса не поддерживается в MariaDB < 10.8. В этом случае индекс с убывающим порядком создаётся как обычный индекс.
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').
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 не поддерживает частичные индексы. Вместо этого частичные индексы можно эмулировать, используя функциональные индексы вместе с Case выражениями.
MySQL и MariaDB
Аргумент condition игнорируется в MySQL и MariaDB, так как ни одна из них не поддерживает условные индексы.
include
-
Index.include
Список или кортеж имён полей, которые должны быть включены в охватывающий индекс в качестве столбцов, не являющихся ключами. Это позволяет использовать сканирование только по индексу для запросов, которые выбирают только включённые поля (include) и фильтруют только по индексированным полям (fields).
Например:
Index(name="covering_index", fields=["headline"], include=["pub_date"])
позволит фильтрацию по headline, а также выбор pub_date, извлекая данные только из индекса.
Использование include создаст меньший индекс, чем использование многостолбцового индекса, но с недостатком, что столбцы, не являющиеся ключами, не могут быть использованы для сортировки или фильтрации.
include игнорируется для баз данных, кроме PostgreSQL.
Index.name требуется при использовании include.
См. документацию PostgreSQL для получения дополнительных сведений о индексах-облочках.
Ограничения для PostgreSQL
PostgreSQL поддерживает индексы-обложки типа B-Tree и GiST indexes. PostgreSQL 14+ также поддерживает индексы-обложки типа SP-GiST indexes.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/5.0/ref/models/indexes/