Spec-Zone.ru › Django 4.0

Справочник по индексам моделей

Классы индексов упрощают создание индексов в базе данных. Их можно добавить, используя опцию 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
Новое в 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

Список или кортеж имён полей, для которых требуется индекс.

По умолчанию индексы создаются с возрастающим порядком для каждого столбца. Чтобы определить индекс с убывающим порядком для столбца, добавьте тире перед именем поля.

Например, Index(fields=['headline', '-pub_date']) создаст SQL с (headline, pub_date DESC). Порядок сортировки индексов не поддерживается в MySQL. В этом случае индекс в порядке убывания создаётся как обычный индекс.

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
Новое в Django 3.2.

Список или кортеж имён полей, которые нужно включить в покрывающий индекс как неключевые столбцы. Это позволяет использовать сканирования только по индексу для запросов, которые выбирают только включённые поля (include) и фильтруют только по индексированным полям (fields).

Например:

Index(name='covering_index', fields=['headline'], include=['pub_date'])

позволит фильтровать по headline, а также выбирать pub_date, получая данные только из индекса.

Использование include создаст меньший индекс, чем использование многостолбцового индекса, но с тем недостатком, что неключевые столбцы не могут использоваться для сортировки или фильтрации.

include игнорируется для баз данных, кроме PostgreSQL.

END_OF_DOCUMENT_MARKER

Index.name требуется при использовании include.

См. документацию PostgreSQL для получения более подробной информации о индексах-облочках.

Ограничения для PostgreSQL

PostgreSQL 11+ поддерживает только индексы-обложки B-Tree, а PostgreSQL 12+ также поддерживает индексы-обложки GiST indexes.

© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/4.0/ref/models/indexes/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API