で複雑な余分ジャンゴORM SQL文を使用し
、余分な(選択=なし、場所=なし、のparams =なし、テーブル=なし、ORDER_BY =なし、select_params =なし)
簡潔に複雑なWHERE句を表現するためにいくつかのケースでは、Djangoのクエリ構文は難しいです。この場合、Djangoは余分に()クエリセットの変更メカニズムを提供し、それが新しい句にクエリセットSQL句で生成することができます。
製品の差別化のために、これらのカスタムので絶対に必要な場合を除き、異なるデータベース(なぜなら、あなたの手書きのコードのSQL)、およびDRY原則に反するとの互換性を保護することは困難照会、または余分を書いて避けるようにしてください。
あなたは、このような選択、どこかのテーブルとして、余分な1つの以上のパラメータparamsを指定することもできます。すべてのパラメータはオプションですが、少なくとも、あなたが使用したいです。
SELECT
SELECTパラメータを使用すると、SELECT句で追加の情報フィールドを追加することができます。これは、辞書、マップのSQL句に属性名を格納する必要があります。
例えば:
Entry.objects.extra(選択= { ' is_recent ':" PUB_DATE> '2006-01-01' " })
各項目オブジェクトの結果は2006年1月1日より後にPUB_DATEかどうかを示すブール値です追加is_recent性質を持っています。
次のようにDjangoは直接SELECT SQLに対応するフラグメントを参加する、SQLの変換しました:
SELECT blog_entry *、(PUB_DATE>。' 2006-01-01 ' ) blog_entry FROM。
次の例は、より複雑であり、それは各ブログ・オブジェクトに追加されるプロパティをENTRY_COUNT、それが関連するエントリの数は、オブジェクト取得するためにサブクエリを実行します。
Blog.objects.extra( 選択 = { ' ENTRY_COUNT ':' blog_entry.blog_id = blog_blog.id blog_entryから選択したCOUNT(*)を' 、} )
(この特定のケースの上に、我々はblog_blogテーブルがすでにFROM句に存在しているという事実を理解する必要があります。)
次のようにSQLに翻訳:
SELECT blog_blog *、(SELECT COUNT(*)WHERE blog_entry.blog_id = blog_entry FROM。blog_blog.id)ENTRY_COUNT AS
blog_blog FROM。
データベースのほとんどは、あなたは彼らが必要としませんので、ジャンゴのselect句で両端句でブラケットを追加する必要があることに留意すべきです。また、いくつかのデータベースでは、このようないくつかのMySQLのバージョンとして、サブクエリをサポートしていないことに注意を引き付けるために。
時には、あなたは、あなたがselect_paramsパラメータを使用することができ、パラメータを渡すSQL文で(選択= ...)余分に与えたいと思うかもしれません。select_paramsのでキューで、両方が正しく対応して一致させる必要があるので、select属性は、辞書です。このケースでは、値ではなく、一般的なPythonのキューを使用するよりも、選択と一致django.utils.datastructures.SortedDict使用する必要があります。
例えば:
Blog.objects.extraは( 選択 = SortedDict([(' '、' %S ')、(' B '、' %S ' )])、 select_params =(' 1 '、' 2 '))
%文字ジャンゴでは、文字列を選択し%sのを見つけて脱出しないように処理するための余分な使用する場合は()「%% s」の部分文字列を含む文字列の選択を避けるために、これはあります。もしそうならば%は脱出したが、正しい結果を得ることができません。
ここで、/テーブル
、あなたはSQLで定義が句、時々実行し、明示的にリンクされていないパラメータ表示を使用することができます。また、手動で他のテーブルを追加FROM句SQLにテーブルを使用することができます。
どこで、テーブルは、引数として文字列のリストを受け入れます。ある「AND」ここで、全てのパラメータ同士の関係。
例えば:
Entry.objects.extra(= [ ' のID(3、4、5、20)' ])
大まかに以下のSQLに変換します。
blog_entry FROM SELECT * WHEREのID(3、4、5、20)。
テーブルを使用する場合は、あなたがテーブルを指定した場合は注意が、その後、クエリに登場しています。テーブルがクエリに含まれている場合は、テーブルパラメータによって、他のデータテーブルを追加すると、その後、Djangoはあなたが一度、このテーブルを含むようにしたいと思うでしょう。質問へのこのリード:繰り返しにより複数のテーブルには、第1の他に、各テーブル名は、それぞれ別名割り当てジャンゴによって繰り返される、エイリアスが与えられます。あなたはここで繰り返しテーブルを使用していますが、それは別名だかわからない、パラメータを使用するのであれば、それはエラーになります。
通常の状況下で、あなただけの新しいテーブルがクエリに表示されません追加することができます。特別な事情が上記発生した場合でも、あなたは解決するために、次の対策を使用することができます。まず、あなたは、重複テーブルを削除することができ、テーブルを複製する必要があるかどうかを判断します。これがない作業を行う場合は、テーブル名の最初の外観の名前が変更されないので、それは問題を解決することがあり、クエリ構造の先頭に余分な()の呼び出しを試してみてください。これは仕事をしない場合は、各データベースの別名を見つけるために生成されたSQL文を表示し、パラメータので、限り、あなたは常にコールクエリ(クエリセット)に同じ方法を使用して、エイリアステーブルがない場合に書き換えますそれは変更されます。直接構築エイリアステーブルを使用することができますので。
ORDER_BY
あなたがソートしたい場合は、(余分にパラメータをORDER_BYことができ、この時点で新しいフィールドまたはデータベース、新しいフィールドを追加する)(余分に合格した場合には)シーケンスをソート文字列が渡されます。フィールド名の文字列を選択して()(従来ORDER_BYを用いた方法と同じように)、また、このフォームTABLE_NAME.COLUMN_NAMEであってもよいし、フィールドであなたは(余分な定義)のネイティブモデルかもしれません。
例えば:
Q = Entry.objects.extra(選択= { ' is_recent ':" PUB_DATE> '2006-01-01' " }) Q = q.extra(ORDER_BY = [ ' -is_recent ' ])
is_recentに従ってソートレコードこのコードは、フィールドの値はTrue上面、偽行の後ろにあります。(真の降順は、先に虚偽のです)。
ところで、上記のコードは、多くの時間が余分に()操作(することができます新しい文の構造を追加するたびに)望むようにあなたが呼び出すことができますによると、明らかにしました。