Ссылка на индекс модели

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

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

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

Параметры Index

classIndex ( 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')

Изменено в Django 3.0:

Добавлена интерполяция переменных '%(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, поскольку ни одна из этих баз данных не поддерживает условные индексы.

Copyright ©2020 All rights reserved