2012-01-10 11 views
3

クエリーセットから関連する選択を削除する方法はありますか?Django。クエリーセットからselect_relatedを削除します

私は、djangoがcount()操作でJOINをSQLクエリに追加することを発見しました。 そこで、我々はこのようなコードがある場合:私は参加削除する方法を探しています

entities = Entities.objects.select_related('subentity').all() 
#We will have INNER JOIN here.. 
entities.count() 

を。 一つの重要な詳細は - 私はDjangoのページネータには、このクエリセットを得たので、私は単に

Entities.objects.all().count() 

答えて

1

を書き込むことはできませんが、あなたがこれを必要とするコードを表示することができ、私はリファクタリングがここに最良の答えだと思います。

entities.query.select_related = Falseがすばらしいのですが、これはかなりハッキリです(後でselect_relatedが必要な場合は値を復元することを忘れないでください)。

+1

私たちの場合はリファクタリングが必要ないと思います。単純な状況 - エンティティのリストをページネーターに挿入します。 1つのクエリでcountとinner joinを使用することでちょっと混乱しますが、それはまったく必要ではありません(関連テーブルのフィルタなし)。ご回答ありがとうございます。それでおしまい。 –

+0

私が理解しているように、select_relatedに引数を与えることによって、関連するテーブルにフィルタを指定しています(select_related()に引数を指定しないと、関連するすべてのオブジェクトを取得し、 、など)。 –

1

私はこのコードのコメントがここで問われる一般的な質問には比較的良い答えを提供信じる:

select_related(なし)が呼び出されていない場合は、リストがクリアされます。

一般的な意味でhttps://github.com/django/django/blob/stable/1.8.x/django/db/models/query.py#L735

、あなたがentitiesクエリセットに何かをするが、最初、それからentities.select_related(None)をselect_relatedの項目を削除したい場合。

しかし、おそらく、ページャーでの特定の状況を解決するものではありません。 entries.count()を実行した場合、はすでにのselect_relatedアイテムを削除します。余分なJOINが発生している場合は、いくつかの非理想的な要因になる可能性があります。 ORMがselect_relatedと組み合わされたときにカウントに影響を与えたりしなかったりするかもしれない他のロジックのため、ORMがそれを取り除くことができない可能性があります。

これらの非理想的なケースの単純な例として、Foo.objects.select_related('bar').count()Foo.objects.select_related('bar').distinct().count()を考えてみましょう。元のクエリーセットには複数のエントリが含まれていないことは明らかですが、Django ORMには明らかではありません。その結果、実行するSQLにはJOINが含まれており、これを回避する普遍的な処方はありません。 .select_related(None)を適用しても、あなたを助けません。

関連する問題