私のアプリケーションでは、次のルックアップを実行します。
my_datapoint = Datapoint.objects.filter(timestamp_lte =desired_time).reverse()[0]
時間的に隣接していないレコードの場合、これを数回実行する必要があります。
複数の個別のQuerySetを使用するよりも、これを効率的にする方法はありますか?それらを組み合わせることができますか?
私のアプリケーションでは、次のルックアップを実行します。
my_datapoint = Datapoint.objects.filter(timestamp_lte =desired_time).reverse()[0]
時間的に隣接していないレコードの場合、これを数回実行する必要があります。
複数の個別のQuerySetを使用するよりも、これを効率的にする方法はありますか?それらを組み合わせることができますか?
これはここで何度も尋ねられてきました。使用できます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」で始まる質問があるオブジェクト、および、このパブ日付またはそのパブ日付のいずれかを持つオブジェクト」を示しています。
「より効率的」とは、データベースに何度もヒットすることを避けたいという意味だと思います。その場合は、一度クエリを実行してから自分でループする必要があります。また、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が提案するように使用してください。