モデル index リファレンスLink to this heading
Index クラスを利用すると、データベースのインデックスの作成が簡単になります。インデックスは、 Meta.indexes オプションを使用して追加できます。このドキュメントでは、 index options を含む Index の API リファレンスを説明します。
Index オプションLink to this heading
- class Index(*expressions, fields=(), name=None, db_tablespace=None, opclasses=(), condition=None, include=None)Link to this definition
データベース内にインデックス (B-Tree) を作成します。
expressionsLink to this heading
- Index.expressionsLink to this definition
位置引数 *expressions を使用すると、式およびデータベース関数に対して関数インデックスを作成できます。
例:
Index(Lower("title").desc(), "pub_date", name="lower_title_date_idx")
この例は、title フィールドを小文字にした値の降順と、pub_date フィールドのデフォルトの昇順で、インデックスを作成します。
もう1つの例:
Index(F("height") * F("weight"), Round("weight"), name="calc_idx")
この例は、height および weight フィールドの積の結果と、weight を直近の整数に丸めた値で、インデックスを作成します。
*expressions を使用する場合、Index.name は必須です。
fieldsLink to this heading
- Index.fieldsLink to this definition
インデックスが必要なフィールド名のリストまたはタプル。
デフォルトでは、各カラムに対して昇順でインデックスが作成されます。カラムに対して降順のインデックスを定義するには、フィールド名の前にハイフンを追加します。
たとえば、Index(fields=['headline', '-pub_date']) は (headline, pub_date DESC) を持つ SQL を作成します。
nameLink to this heading
- Index.nameLink to this definition
インデックスの名前。name が与えられなかった場合、Django は名前を自動生成します。異なるデータベースとの互換性のため、インデックス名は最長30文字で、数字 (0-9) またはアンダースコア (_) から始めることはできません。
db_tablespaceLink to this heading
- Index.db_tablespaceLink to this definition
このインデックスに対して使用する データベースの tablespace の名前。単一フィールドのインデックスに対して、db_tablespace が提供されなかった場合、インデックスはフィールドの db_tablespace に作成されます。
Field.db_tablespace が指定されなかった場合 (または、インデックスが複数フィールドを使用している場合)、インデックスは、モデルの class Meta 内の db_tablespace オプションで指定されたtablespace 内に作成されます。もしどちらの tablespace も設定されていなかった場合には、インデックスはテーブルと同じ tablespace 内に作成されます。
opclassesLink to this heading
- Index.opclassesLink to this definition
このインデックスで使用する PostgreSQL の演算子クラス の名前。カスタム演算子クラスが必要な場合、インデックス内の各フィールドごとに1つ指定する必要があります。
たとえば、GinIndex(name='json_index', fields=['jsonfield'], opclasses=['jsonb_path_ops']) は、jsonb_path_ops を使用して jsonfield に gin インデックスを作成します。
opclasses はPostgreSQL以外のデータベースでは無視されます。
opclasses を使用する場合、Index.name が必要です。
conditionLink to this heading
- Index.conditionLink to this definition
テーブルが非常に大きくて、ほとんどクエリが行のサブセットを対象としている場合、インデックスをそのサブセットに制限すると役に立つかもしれません。条件を Q として指定してください。たとえば、condition=Q(pages__gt=400) は、400ページ以上あるレコードにインデックスを作成します。
condition を使用する場合、Index.name が必要です。
includeLink to this heading
- Index.includeLink to this definition
非キーのカラムとしてカバーインデックスに含まれる、フィールド名のリストまたはタプル。これにより、含まれるフィールド (include) のみを select するクエリと、インデックスされたフィールド (fields) のみによってフィルタするクエリに対して、インデックスのみのスキャンが利用できるようになります。
例:
Index(name="covering_index", fields=["headline"], include=["pub_date"])
この例は、データをインデックスからのみ取得しながら、headline のフィルタリングと、pub_date の select を可能にします。
include を使うと、複数カラムのインデックスを使用するより小さなインデックスが生成されますが、非キーのカラムがソートやフィルタリングに使えないという欠点があります。
include は、PostgreSQL 以外のデータベースでは無視されます。
include を使用する場合、Index.name は必須です。
covering indexes に関する詳細については、PostgreSQL のドキュメントを参照してください。