0

私のアプリケーションでは、次のルックアップを実行します。

my_datapoint = Datapoint.objects.filter(timestamp_lte =desired_time).reverse()[0]

時間的に隣接していないレコードの場合、これを数回実行する必要があります。

複数の個別のQuerySetを使用するよりも、これを効率的にする方法はありますか?それらを組み合わせることができますか?

4

2 に答える 2

4

これはここで何度も尋ねられてきました。使用できますchain

from itertools import chain

combined = chain(qs1, qs2, ...)
for item in combined:
    # foo

Qクエリセットオブジェクトを完全に分離するための1つの代替方法は、オブジェクトを使用して「OR」クエリでそれを実行できるかどうかを確認することです
。https ://docs.djangoproject.com/en/1.4/topics/db/queries/#complex-lookups- with-q-objects

ドキュメントからの例

Poll.objects.get(
    Q(question__startswith='Who'),
    Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6))
)

この例では、「「Who」で始まる質問があるオブジェクト、および、このパブ日付またはそのパブ日付のいずれかを持つオブジェクト」を示しています。

于 2012-05-21T17:24:23.893 に答える
1

「より効率的」とは、データベースに何度もヒットすることを避けたいという意味だと思います。その場合は、一度クエリを実行してから自分でループする必要があります。また、QuerySetを使用して並べ替える方が適切です。reverse()

my_datapoint = Datapoint.objects.filter(timestamp_lte = max_desired_time).order_by('-timestamp')
def getLatest(desired_time):
    for item in my_datapoint:
        if item.timestamp <= desired_time:
            return item

より単純な構文が必要な場合はchain、jdiが提案するように使用してください。

于 2012-05-21T17:43:12.277 に答える