Ссылка на модельный указатель

Индексные классы упрощают создание индексов базы данных. Их можно добавить с помощью Meta.indexesопции. В этом документе объясняются ссылки на API, Indexкоторые включают параметры индекса .

Ссылки на встроенные индексы

Индексы определены в django.db.models.indexes, но для удобства они импортируются в django.db.models. Стандартное соглашение заключается в использовании и обозначении индексов как .from django.db import modelsmodels.<IndexClass>

Indexварианты

classIndex ( * выражения , fields = () , name = None , db_tablespace = None , opclasses = () , condition = None , include = None )

Создает индекс (B-Tree) в базе данных.

expressions

Index.expressions
Новое в Django 3.2.

Позиционный аргумент *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'])jsonfieldjsonb_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
Новое в Django 3.2.

Список или кортеж имен полей, которые должны быть включены в индекс покрытия в качестве неключевых столбцов. Это позволяет использовать сканирование только по индексу для запросов, которые выбирают только включенные поля ( 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

Copyright ©2021 All rights reserved