Python django models index

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

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

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

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

Index варианты ¶

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

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

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 требует, чтобы функции, указанные в индексе, были помечены как DETERMINISTIC . Django не проверяет это, но Oracle выдаст ошибку. Это означает, что такие функции, как Random() , не принимаются.

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

PostgreSQL требует, чтобы функции и операторы, указанные в индексе, были помечены как IMMUTABLE . Django не проверяет это, но PostgreSQL выдаст ошибку. Это означает, что такие функции, как Concat() , не принимаются.

fields ¶

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

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

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

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 ¶

Имя табличного пространства базы данных, которое будет использоваться для этого индекса. Для индексов одного поля, если db_tablespace он не указан, индекс создается в db_tablespace поле.

Если Field.db_tablespace не указан (или если индекс использует несколько полей), индекс создается в табличном пространстве, указанном в db_tablespace параметре внутри модели . Если ни одно из этих табличных пространств не установлено, индекс создается в том же табличном пространстве, что и таблица. class Meta

Список индексов, специфичных для PostgreSQL, см django.contrib.postgres.indexes . В разделе .

opclasses ¶

Имена классов операторов PostgreSQL, используемых для этого индекса. Если вам нужен собственный класс операторов, вы должны предоставить по одному для каждого поля в индексе.

Например, создает индекс джина при использовании . GinIndex(name=’json_index’, fields=[‘jsonfield’], opclasses=[‘jsonb_path_ops’]) jsonfield jsonb_path_ops

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

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

condition ¶

Если таблица очень большая и ваши запросы в основном нацелены на подмножество строк, может быть полезно ограничить индекс этим подмножеством. Задайте условие как Q . Например, condition=Q(pages__gt=400) индексирует записи, содержащие более 400 страниц.

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

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

PostgreSQL требует, чтобы функции, указанные в условии, были помечены как IMMUTABLE. Django не проверяет это, но PostgreSQL выдаст ошибку. Это означает , что функции , такие как Дата функция и Concat не принимаются. Если вы храните даты DateTimeField , сравнение с datetime объектами может потребовать предоставления tzinfo аргумента, потому что в противном случае сравнение может привести к изменяемой функции из-за преобразования, которое Django выполняет для поиска .

SQLite накладывает ограничения на создание частичного индекса.

Oracle не поддерживает частичные индексы. Вместо этого частичные индексы можно эмулировать, используя функциональные индексы вместе с Case выражениями.

condition Аргумент игнорируется с MySQL и MariaDB , как ни опор условных индексов.

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

Источник

Model index reference¶

Index classes ease creating database indexes. They can be added using the Meta.indexes option. This document explains the API references of Index which includes the index options.

Referencing built-in indexes

Indexes are defined in django.db.models.indexes , but for convenience they’re imported into django.db.models . The standard convention is to use from django.db import models and refer to the indexes as models. .

Index options¶

class Index ( * expressions , fields = () , name = None , db_tablespace = None , opclasses = () , condition = None , include = None ) [source] ¶

Creates an index (B-Tree) in the database.

expressions ¶

Positional argument *expressions allows creating functional indexes on expressions and database functions.

Index(Lower('title').desc(), 'pub_date', name='lower_title_date_idx') 

creates an index on the lowercased value of the title field in descending order and the pub_date field in the default ascending order.

Index(F('height') * F('weight'), Round('weight'), name='calc_idx') 

creates an index on the result of multiplying fields height and weight and the weight rounded to the nearest integer.

Index.name is required when using *expressions .

Oracle requires functions referenced in an index to be marked as DETERMINISTIC . Django doesn’t validate this but Oracle will error. This means that functions such as Random() aren’t accepted.

Restrictions on PostgreSQL

PostgreSQL requires functions and operators referenced in an index to be marked as IMMUTABLE . Django doesn’t validate this but PostgreSQL will error. This means that functions such as Concat() aren’t accepted.

Functional indexes are ignored with MySQL < 8.0.13 and MariaDB as neither supports them.

fields ¶

A list or tuple of the name of the fields on which the index is desired.

By default, indexes are created with an ascending order for each column. To define an index with a descending order for a column, add a hyphen before the field’s name.

For example Index(fields=[‘headline’, ‘-pub_date’]) would create SQL with (headline, pub_date DESC) . Index ordering isn’t supported on MySQL. In that case, a descending index is created as a normal index.

name ¶

The name of the index. If name isn’t provided Django will auto-generate a name. For compatibility with different databases, index names cannot be longer than 30 characters and shouldn’t start with a number (0-9) or underscore (_).

Partial indexes in abstract base classes

You must always specify a unique name for an index. As such, you cannot normally specify a partial index on an abstract base class, since the Meta.indexes option is inherited by subclasses, with exactly the same values for the attributes (including name ) each time. To work around name collisions, part of the name may contain ‘%(app_label)s’ and ‘%(class)s’ , which are replaced, respectively, by the lowercased app label and class name of the concrete model. For example Index(fields=[‘title’], name=’%(app_label)s_%(class)s_title_index’) .

db_tablespace ¶

The name of the database tablespace to use for this index. For single field indexes, if db_tablespace isn’t provided, the index is created in the db_tablespace of the field.

If Field.db_tablespace isn’t specified (or if the index uses multiple fields), the index is created in tablespace specified in the db_tablespace option inside the model’s class Meta . If neither of those tablespaces are set, the index is created in the same tablespace as the table.

For a list of PostgreSQL-specific indexes, see django.contrib.postgres.indexes .

Источник

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

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

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

Опции Index ¶

class Index ( * expressions , fields = () , name = None , db_tablespace = None , opclasses = () , condition = None , include = None ) [исходный код] ¶

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

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 требует, чтобы функции, указанные в индексе, были помечены как DETERMINISTIC . Django не проверяет это, но Oracle выдаст ошибку. Это означает, что такие функции, как Random() не принимаются.

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

PostgreSQL требует, чтобы функции и операторы, указанные в индексе, были помечены как IMMUTABLE . Django не проверяет это, но PostgreSQL выдаст ошибку. Это означает, что такие функции, как Concat() не принимаются.

fields ¶

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

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

Например, Index(fields=[‘headline’, ‘-pub_date’]) создаст SQL с (headline, pub_date DESC) .

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 ¶

Имя табличного пространства базы данных для использования в этом индексе. Для индексов с одним полем, если db_tablespace не указан, индекс создается в db_tablespace поля.

Если Field.db_tablespace не указан (или если индекс использует несколько полей), индекс создается в табличном пространстве, указанном в параметре db_tablespace внутри class Meta модели. Если ни одно из этих табличных пространств не задано, индекс создается в том же табличном пространстве, что и таблица.

Список специфичных для PostgreSQL индексов см. в разделе django.contrib.postgres.indexes .

Источник

Читайте также:  What is wsgi in python
Оцените статью