Ссылка на индекс модели ¶
Индексные классы упрощают создание индексов базы данных. Их можно добавить с опцией 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-Tree) в базе данных.
fields
¶
-
Index.
fields
¶
Список или кортеж имен полей для индексации.
По умолчанию индексы создаются с сортировкой по возрастанию для каждого столбца. Чтобы определить индекс с сортировкой по убыванию для определенного столбца, добавьте дефис перед именем поля.
Например, производит код SQL, содержащий . Сортировка по индексам не поддерживается MySQL. В этом случае индекс с сортировкой по убыванию рассматривается как нормальный индекс.Index(fields=['headline', '-pub_date'])
(headline, pub_date DESC)
name
¶
-
Index.
name
¶
Имя индекса. Если name
не указан, Django автоматически сгенерирует имя. Для совместимости с различными базами данных имена индексов не могут быть длиннее 30 символов и не должны начинаться с цифры (0-9) или символа подчеркивания (_).
Частичные индексы в абстрактных базовых классах
Индекс всегда должен иметь однозначное имя. Это означает, что невозможно определить частичный индекс в абстрактном базовом классе, так как параметр Meta.indexes
наследуется подклассами с точно такими же значениями атрибутов (включая name
). Чтобы избежать коллизии имен, имя может содержать, которое будет заменено, соответственно, меткой приложения и именем класса конкретной модели (все в нижнем регистре). Например, .'%(app_label)s'``et ``'%(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
в классе 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)
будет индексировать строки с полем pages
больше 400.
Index.name
обязательно при использовании condition
.
Ограничения для PostgreSQL
PostgreSQL требует, чтобы функции, указанные в условии, были помечены как IMMUTABLE. Django не проверяет это, но PostgreSQL выдаст ошибку. Это означает, что такие функции, как Date, и Concat
не разрешены. Если вы храните даты в поле DateTimeField
, для сравнения с объектами datetime
может потребоваться наличие параметра, tzinfo
потому что в противном случае сравнение может привести к «изменяемой» функции из-за принуждения типа, которое Django выполняет для выражений запросов .
Ограничения для SQLite
SQLite накладывает ограничения на то, как может быть построен частичный индекс.
оракул
Oracle не поддерживает частичные индексы. Однако частичные индексы можно эмулировать с помощью функциональных индексов. Используйте миграцию, чтобы добавить индекс с помощью RunSQL
.
MySQL и MariaDB
Параметр condition
игнорируется в MySQL и MariaDB, поскольку ни одна из этих баз данных не поддерживает условные индексы.