ルックアップAPIリファレンス
このドキュメントには、ルックアップのAPIリファレンス、データベースクエリのWHERE
句を構築するためのDjangoAPIが含まれています。 ルックアップを使用する方法については、クエリの作成を参照してください。 新しいルックアップを作成する方法については、カスタムルックアップを参照してください。
ルックアップAPIには、ルックアップを登録する RegisterLookupMixin クラスと、ルックアップとして登録できるようにクラスが実装する必要のあるメソッドのセットである Query Expression API の2つのコンポーネントがあります。
Djangoには、クエリ式APIに続く2つの基本クラスがあり、そこからすべてのDjango組み込みルックアップが派生します。
ルックアップ式は、次の3つの部分で構成されます。
- フィールド部分(例:
Book.objects.filter(author__best_friends__first_name...
); - パーツを変換します(省略できます)(例:
__lower__first3chars__reversed
); - ルックアップ(例:
__icontains
)。省略した場合、デフォルトで__exact
になります。
登録API
Djangoは RegisterLookupMixin を使用して、クラスにルックアップを登録するためのインターフェイスを提供します。 2つの顕著な例は、すべてのモデルフィールドの基本クラスである Field と、すべてのDjangoトランスフォームの基本クラスである Transform です。
- class lookups.RegisterLookupMixin
クラスにルックアップAPIを実装するミックスイン。
- classmethod register_lookup(lookup, lookup_name=None)
クラスに新しいルックアップを登録します。 たとえば、
DateField.register_lookup(YearExact)
は、DateField
でYearExact
ルックアップを登録します。 同じ名前ですでに存在するルックアップをオーバーライドします。lookup_name
は、提供されている場合はこのルックアップに使用され、提供されていない場合はlookup.lookup_name
が使用されます。
- get_lookup(lookup_name)
クラスに登録されている
lookup_name
という名前の Lookup を返します。 デフォルトの実装は、すべての親クラスを再帰的に調べ、lookup_name
という名前のルックアップが登録されているかどうかを確認し、最初の一致を返します。
- get_lookups()
Lookup クラスにマップされたクラスに登録されている各ルックアップ名の辞書を返します。
- get_transform(transform_name)
transform_name
という名前の Transform を返します。 デフォルトの実装は、すべての親クラスを再帰的に調べて、transform_name
という名前の登録済み変換があるかどうかを確認し、最初の一致を返します。
クラスをルックアップにするには、クエリ式API に従う必要があります。 Lookup と Transform は当然このAPIに従います。
クエリ式API
クエリ式APIは、クラスがクエリ式で使用できるように定義するメソッドの一般的なセットであり、SQL式に変換されます。 直接フィールド参照、集計、およびTransform
は、このAPIに続く例です。 クラスは、次のメソッドを実装する場合、クエリ式APIに従うと言われます。
- as_sql(compiler, connection)
式のSQLフラグメントを生成します。 タプル
(sql, params)
を返します。ここで、sql
はSQL文字列であり、params
はクエリパラメータのリストまたはタプルです。compiler
はSQLCompiler
オブジェクトであり、他の式のコンパイルに使用できるcompile()
メソッドがあります。connection
は、クエリの実行に使用される接続です。expression.as_sql()
の呼び出しは通常正しくありません。代わりに、compiler.compile(expression)
を使用する必要があります。compiler.compile()
メソッドは、式のベンダー固有のメソッドの呼び出しを処理します。as_vendorname()
メソッドまたはサブクラスがSQL文字列の生成をオーバーライドするためにデータを提供する必要がある可能性が高い場合は、このメソッドでカスタムキーワード引数を定義できます。 使用例については、 Func.as_sql()を参照してください。
- as_vendorname(compiler, connection)
as_sql()
メソッドのように機能します。 式がcompiler.compile()
によってコンパイルされると、Djangoは最初にas_vendorname()
を呼び出そうとします。ここで、vendorname
はクエリの実行に使用されるバックエンドのベンダー名です。vendorname
は、Djangoの組み込みバックエンド用のpostgresql
、oracle
、sqlite
、またはmysql
のいずれかです。
- get_lookup(lookup_name)
lookup_name
という名前のルックアップを返す必要があります。 たとえば、self.output_field.get_lookup(lookup_name)
を返します。
- get_transform(transform_name)
transform_name
という名前のルックアップを返す必要があります。 たとえば、self.output_field.get_transform(transform_name)
を返します。
- output_field
get_lookup()
メソッドによって返されるクラスのタイプを定義します。 フィールドインスタンスである必要があります。
Transformリファレンス
- class Transform
Transform
は、フィールド変換を実装するためのジェネリッククラスです。 顕著な例は、DateField
をIntegerField
に変換する__year
です。ルックアップ式で
Transform
を使用するための表記は、<expression>__<transformation>
です(例:date__year
)。このクラスは、クエリ式API に従います。これは、
<expression>__<transform1>__<transform2>
を使用できることを意味します。 これは、1つの引数のみを受け入れる特殊な Func()式です。 フィルタの右側で使用することも、注釈として直接使用することもできます。- bilateral
この変換を
lhs
とrhs
の両方に適用する必要があるかどうかを示すブール値。 二国間変換は、ルックアップ式に表示されるのと同じ順序でrhs
に適用されます。 デフォルトでは、False
に設定されています。 使用例については、カスタムルックアップを参照してください。
- lhs
左側-変換されているもの。 クエリ式API に従う必要があります。
- lookup_name
ルックアップの名前。クエリ式の解析でルックアップを識別するために使用されます。 文字列
"__"
を含めることはできません。
- output_field
この変換が出力するクラスを定義します。 フィールドインスタンスである必要があります。 デフォルトでは、
lhs.output_field
と同じです。
Lookupリファレンス
- class Lookup
Lookup
は、ルックアップを実装するためのジェネリッククラスです。 ルックアップは、左側が lhs のクエリ式です。 右側、 rhs ;lookup_name
。式でルックアップを使用するための表記法は
<lhs>__<lookup_name>=<rhs>
です。このクラスはクエリ式として機能しますが、構造に
=<rhs>
があるため、ルックアップは常にルックアップ式の終わりである必要があります。- lhs
左側-調べているもの。 オブジェクトは、クエリ式API に従う必要があります。
- rhs
右側-
lhs
が比較されているもの。 これは、プレーンな値、またはSQLにコンパイルされるもの、通常はF()
オブジェクトまたはQuerySet
の場合があります。
- lookup_name
このルックアップの名前。クエリ式の解析でルックアップを識別するために使用されます。 文字列
"__"
を含めることはできません。
- process_lhs(compiler, connection, lhs=None)
compiler.compile(lhs)
によって返されるように、タプル(lhs_string, lhs_params)
を返します。 このメソッドをオーバーライドして、lhs
の処理方法を調整できます。compiler
はSQLCompiler
オブジェクトであり、lhs
をコンパイルするためにcompiler.compile(lhs)
のように使用されます。connection
は、ベンダー固有のSQLのコンパイルに使用できます。lhs
がNone
でない場合は、self.lhs
ではなく、処理済みのlhs
として使用してください。
- process_rhs(compiler, connection)
右側については、 process_lhs()と同じように動作します。