Ссылка на модельный указатель ¶
Индексные классы упрощают создание индексов базы данных. Их можно добавить с помощью
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 , include = None ) ¶ Создает индекс (B-Tree) в базе данных.
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
¶
Список или кортеж имен полей, для которых требуется индекс.
По умолчанию индексы создаются в порядке возрастания для каждого столбца. Чтобы определить индекс для столбца в порядке убывания, добавьте дефис перед именем поля.
Например, можно было бы создать 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'
и '%(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'])
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 11+ поддерживает только покрывающие индексы B-Tree, а PostgreSQL 12+ также поддерживает покрывающие .GiST indexes