0

Djangoは、すべてのクエリセットが自動的にキャッシュされるとドキュメントで述べています。https://docs.djangoproject.com/en/dev/topics/db/queries/#caching-and-querysets。しかし、これらはこの機能の詳細についてはそれほど具体的ではありませんでした。

彼らが示した例は、qsをpython変数に保存することであり、最初の呼び出しの後の後続の呼び出しはキャッシュから取得されます。

queryset = Entry.objects.all()
print([クエリセット内のpのp.headline])#クエリセットを評価します。
print([p.pub_date for p in queryset])#評価からキャッシュを再利用します。

したがって、ユーザーがビューをロードしたときに、変数なしで2つの正確なクエリセット呼び出しが行われた場合でも、結果はキャッシュされませんか?

# When the user loads the homepage, call number one (not cached)
def home(request):    
    entries = Entry.objects.filter(something)
    return render_to_response(...)

# Call number two, is this cached automatically? Or do I need to import cache and
# manually do it? This is the same method as above, called twice
def home(request):    
    entries = Entry.objects.filter(something)
    return render_to_response(...)

わかりにくい場合は、メソッドを2回貼り付けて、ユーザーが2回呼び出しているように見せました。これは、1つのメソッドだけです。エントリは自動的にキャッシュされますか?

ありがとう

4

3 に答える 3

1

次の 2 つの理由でキャッシュされません。

  • just を使用filterし、結果を「ループ」しない場合、クエリセットはまだ評価されていません。つまり、キャッシュはまだ空です。
  • 2回目に関数を呼び出すとクエリセットが再作成されるため(新しいローカル変数)、最初に関数を呼び出したときにすでに作成されているため、評価されてもキャッシュされません。2 番目の関数呼び出しは、以前に行ったことを単純に「認識」していません。これは単なる新しいクエリセット インスタンスです。ただし、この場合、データベース キャッシュに依存する可能性があります。
于 2012-09-27T07:11:02.693 に答える
1

querysetあなたが与えた例querysetsは、遅延評価される、つまり初めて使用されることを正しく示しています。そのため、後で再度使用すると、変数に割り当てられたときに同じフローで評価されません。これは正確にはキャッシングではなく、最適化された方法で利用できる限り、評価された式を再利用します。

見ているキャッシュの種類、つまり同じビューが 2 回呼び出されている場合、データベース オブジェクトを最初にフェッチするときに、データベース オブジェクトを手動でキャッシュする必要があります。Memcachedはこれに適しています。その後、以下の例のようにチェックしてフェッチします。

def view(request):
    results = cache.get(request.user.id)
    if not results:
        results = do_a_ton_of_work()
        cache.set(request.user.id, results)

もちろん、プロキシ サーバーから URL ごとのキャッシュまで、さまざまなレベルでキャッシュを行う方法は他にもたくさんあります。あなたに最適なものは何でも。ここでは、このトピックについてよく読んでください。

于 2012-09-27T07:15:48.693 に答える
0

Memcached は組み込みモジュールであり、うまく機能しますが、より良い結果を得るために「johnny cache」を試すこともできます。

あなたはここでより多くの情報を得ることができます

http://packages.python.org/johnny-cache/

于 2012-09-27T07:58:40.610 に答える