0

私は、ページネーションやその他のクールな自動化のために、ビューの1つでobject_list()メソッドを手動で使用しています。私は巨大なクエリセットをキャッシュして、object_listに影響を与える可能性のあるすべてのもの(例:request.GET ['page'])を処理しようとしますが、単純なアイデアは次のようになります。

def some_view(request):
qs = cache.get('key')
if qs == None:
    qs = QS.objects.filter(some_huge_query)
    cache.set('key', qs)
return object_list(queryset = qs,...)

実際には、クエリセットはテンプレートのレンダリング中にもう一度実行されます。クエリセットが実行されないようにする方法はありますか?

4

4 に答える 4

0

評価されたクエリセットをキャッシュに保存する必要があるため、次を呼び出す必要があります。

cache.set('key', list(qs))

クエリセットを強制的にリストに評価します。そうしないと、クエリがキャッシュに格納されるだけになります。

于 2011-07-11T23:07:16.910 に答える
0

values_list を使用して、その巨大なQuerySetをリストに変換し、そのリストをテンプレートに渡すことができます。これにより、QuerySet が再評価されます。

于 2011-07-11T21:25:07.910 に答える
0

私の知る限りでは:

if qs == None:

あなたのクエリセットを評価するかもしれません。少なくとも、クエリセットを評価するif qsかどうかはかなり確信しています。if not qs

試す:

if qs is not None:

object_listまた、メソッドとテンプレートを確認することも役立ちます。

于 2011-07-12T11:11:55.947 に答える