モデルインデックスリファレンス—Djangoドキュメント

提供:Dev Guides
< DjangoDjango/docs/2.2.x/ref/models/indexes
移動先:案内検索

モデルインデックスリファレンス

インデックスクラスは、データベースインデックスの作成を容易にします。 Meta.indexes オプションを使用して追加できます。 このドキュメントでは、インデックスオプションを含むインデックスのAPIリファレンスについて説明します。

組み込みインデックスの参照

インデックスは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)
データベースにインデックス(Bツリー)を作成します。

fields

Index.fields

インデックスが必要なフィールドの名前のリストまたはタプル。

デフォルトでは、インデックスは列ごとに昇順で作成されます。 列の降順でインデックスを定義するには、フィールド名の前にハイフンを追加します。

たとえば、Index(fields=['headline', '-pub_date'])(headline, pub_date DESC)でSQLを作成します。 インデックスの順序付けはMySQLではサポートされていません。 その場合、降順のインデックスが通常のインデックスとして作成されます。

バージョン2.1で変更:古いバージョンはタプルを受け入れません。


name

Index.name

インデックスの名前。 nameが指定されていない場合、Djangoは名前を自動生成します。 異なるデータベースとの互換性のために、インデックス名は30文字を超えることはできず、数字(0〜9)またはアンダースコア(_)で始めることはできません。

抽象基本クラスの部分インデックス

インデックスには常に一意の名前を指定する必要があります。 そのため、 Meta.indexes オプションはサブクラスに継承され、属性の値はまったく同じであるため(nameを含む)、通常、抽象基本クラスに部分インデックスを指定することはできません。毎回。 代わりに、サブクラスでindexesオプションを直接指定して、各インデックスに一意の名前を指定します。


db_tablespace

Index.db_tablespace

このインデックスに使用するデータベーステーブルスペースの名前。 単一フィールドインデックスの場合、db_tablespaceが指定されていない場合、インデックスはフィールドのdb_tablespaceに作成されます。

Field.db_tablespace が指定されていない場合(またはインデックスが複数のフィールドを使用している場合)、インデックスはモデルのclass Meta内の db_tablespace オプションで指定されたテーブルスペースに作成されます。 。 これらのテーブルスペースのどちらも設定されていない場合、インデックスはテーブルと同じテーブルスペースに作成されます。

も参照してください

PostgreSQL固有のインデックスのリストについては、 django.contrib.postgres.indexes を参照してください。


opclasses

Index.opclasses

バージョン2.2の新機能。


このインデックスに使用する PostgreSQLオペレータークラスの名前。 カスタム演算子クラスが必要な場合は、インデックスの各フィールドに1つずつ指定する必要があります。

たとえば、GinIndex(name='json_index', fields=['jsonfield'], opclasses=['jsonb_path_ops'])は、jsonb_path_opsを使用してjsonfieldにジンインデックスを作成します。

opclassesは、PostgreSQL以外のデータベースでは無視されます。

opclassesを使用する場合は、 Index.name が必要です。


condition

Index.condition

バージョン2.2の新機能。


テーブルが非常に大きく、クエリのほとんどが行のサブセットを対象としている場合は、インデックスをそのサブセットに制限すると便利な場合があります。 条件を Q として指定します。 たとえば、condition=Q(pages__gt=400)は、400ページを超えるレコードにインデックスを付けます。

conditionを使用する場合は、 Index.name が必要です。

PostgreSQLの制限

PostgreSQLでは、条件で参照される関数をIMMUTABLEとしてマークする必要があります。 Djangoはこれを検証しませんが、PostgreSQLはエラーになります。 これは、日付関数連結などの関数が受け入れられないことを意味します。 日付を DateTimeField に格納する場合、datetimeオブジェクトとの比較では、tzinfo引数を指定する必要があります。そうしないと、Djangoのキャストにより、比較によって可変関数が発生する可能性があります。 ルックアップに対して行います。


SQLiteの制限

SQLite は、部分インデックスの構築方法に制限を課しています。


オラクル

Oracleは部分インデックスをサポートしていません。 代わりに、部分インデックスは機能インデックスを使用してエミュレートできます。 マイグレーションを使用して、 RunSQL を使用してインデックスを追加します。


MySQLとMariaDB

condition引数は、MySQLとMariaDBではどちらも条件付きインデックスをサポートしていないため、無視されます。