2011-06-09 13 views
0

まず、何が本当に(参加し、最初の部分はommited)自体NULLない場合には(次のクエリの作業を行う方法、モデルFooを与えられ、それがBarを指しM2Mです:ジャンゴ - クエリセットと一般的なSQLの質問

>> print Foo.objects.get(bar__isnull=True).query 
...WHERE "barapp_bar"."id" IS NULL 

ヌルものは、関連するM2Mによるフィルタリングに関して私をオフにスローされます第二に

、行の多くを扱うときに速く、この類似したクエリを作るための方法があります:

Foo.objects.get(bar__in=[bar1, bar2, bar3, bar4]) 

答えて

0

省略された結合が重要です。完全なクエリを見ると、Djangoはfooテーブルから結合テーブルfoo_barbarテーブルの2つのLeft Outer Joinsを実行します。

2つのfoosと2つのbarsを考えてください。 foo_1bar_1およびbar_2に関連させ、foo_2barsに関連させないようにします。少なくとも一度fooを含んで

2つの左の外側で、以下のクエリが加わり、およびNULLは任意のbarsに関連しないfoo_2ためのバーの列に表示されます。我々は唯一の任意のbarsに関連していないfoosをしたいので

SELECT foo.id as foo_id, bar.id as bar_id 
FROM foo LEFT OUTER JOIN foo_bar 
    ON foo_id = foo_bar.foo_id 
LEFT OUTER JOIN bar 
    ON foo_bar.bar_id = bar.id; 
+--------+--------+ 
| foo_id | bar_id | 
+--------+--------+ 
| 1  | 1  | 
| 1  | 2  | 
| 2  | NULL | 
+--------+--------+ 

Foo.objects.get(bar__isnull=True)ためのクエリがこれに似ていますが、それはバーテーブルから何も選択しないと、それはbar.idでフィルタは、NULLです。

SELECT foo.id as foo_id 
FROM foo LEFT OUTER JOIN foo_bar 
    ON foo_id = foo_bar.foo_id 
LEFT OUTER JOIN bar 
    ON foo_bar.bar_id = bar.id 
where bar_id is NULL; 
+--------+ 
| foo_id | 
+--------+ 
| 2  | 
+--------+ 
+0

ありがとうございました!同じ結果を達成するための最適化クエリに関する2番目の質問はどうでしょうか?それも可能ですか? – orokusaki

+0

私はあなたの2番目の質問に対する提案はありません。 Djangoの 'syncdb'コマンドを使用してテーブルを作成した場合、クエリが効率的になるように、テーブルに適切なインデックスが設定されている必要があります。 – Alasdair

関連する問題