2012-03-23 1 views
1

私のプログラムでは、エンティティを検索するためのユーティリティ関数があります。それはmax_countパラメータをとります。 QuerySetを返します。クエリセットのスライスを取らずにDjangoクエリでLIMITパラメータを提供する

この機能では、エントリの最大数を制限したいと考えています。標準的な方法は、私のクエリセットのうちのスライスを取るために、次のようになります。

return results[:max_count] 

私の問題は.order_by()を使用してさまざまな方法でこの機能の並べ替えを利用ビューということです。スライスを取った後に再順序付けが許可されないため、例外が発生します。

スライスをとらずにSQLクエリに「LIMIT 1000」を強制することはできますか?

+0

afaik [:max_count]はLIMITとして評価されます。 order_byを使用すると、すべてのレコードのサブセットのみを取得し、サブセットで実行されたorder_byを使用した次の問合せでは異なる結果が返されるため、結果を並べ替えることはできません。 – yedpodtrzitko

+0

@yedpodtrzitko私はそれを理解しています。私の質問は、スライスを取らず、実行の後で再利用できるLIMITを実行する別の方法があるかどうかです。 –

+0

@KoliberServices私は同じ質問をして実際に掘り出した。 http://stackoverflow.com/questions/29360146/limiting-the-number-of-results-from-a-django-queryset-without-using-slice/29360314#29360314 –

答えて

1

Do results[:max_count].order_by()の後に表示されます。 DBからあまりにも多くを要求するのを恐れてはいけません。クエリはスライスまで評価されません。

0

これを達成するために、すべてのスライスを無視して__getitem__の最後の[:max_count]を実行するだけで、QuerySetをサブクラス化できますが、複雑で副作用があるとは思いません。

あなたが大規模なクエリセットによるメモリ消費を心配している場合は、通常の使用ではhttp://www.mellowmorning.com/2010/03/03/django-query-set-iterator-for-really-large-querysets/

に従うだけDrTyrsaの提案に従ってください。コードを単純化するために、コード内にorder_byとそれ以降のスライスを短縮するためのショートカットを書くことができます。

関連する問題