2

さまざまなdjangoクエリセットを介してdbからデータを取得するために複数の方法を使用していますが、各クエリセットのランタイムと、可能であればより良い方法を知りたいです(一定時間でデータを取得するために!!)

qs = MyModel.objects.order_by('-time')
qs = qs.filter(blah = blah)

最初のエントリを取得するには、次のようにしています。

entry = list(qs[:1])
first_entry = entry[0]

または、10 番目の最後のエントリを取得するには:

entry = list(qs)
some_entry = entry[9]
last_entry = entry[-1] 

しかし、これには O(n) 時間がかかると思いますが、定数時間で n 番目の項を取得する方法はありますか? エントリのIDまたはその他の値(ソート済み)がわからないため、get()を使用したくありませんが、位置のみです。

注釈を使用することもできますが、これには O(n) ランタイムもかかります。

MyModel.objects.values('date').annotate(min_value=Min('value')).order_by('min_value')[0] 

一定の時間内にそのエントリが必要な位置を知っていますか?

4

1 に答える 1

5

ドキュメントから:

Python の配列スライス構文のサブセットを使用して、QuerySet を特定の数の結果に制限します。これは、SQL の LIMIT 句と OFFSET 句に相当します。

通常、QuerySet をスライスすると新しい QuerySet が返されますが、クエリは評価されません。例外は、Python スライス構文の「step」パラメーターを使用する場合です。

リストではなく単一のオブジェクトを取得するには (例: SELECT foo FROM bar LIMIT 1)、スライスの代わりに単純なインデックスを使用します。

https://docs.djangoproject.com/en/dev/topics/db/queries/#limiting-querysets

スライスするときにクエリセットを評価しないという部分は重要な部分です。

于 2013-05-14T23:23:33.327 に答える