私はDjangoアプリケーションでいくつかのQuerysetアクションを実行し、その結果をMemcacheに設定する機能を持っています。それは関数なので一般的な使い方でなければなりません。したがって、再利用可能にするために、私はfilter
とexclude
アクションのパラメータとしてdictを渡します。私は{'title': 'foo', 'name': 'bar'}
のような単純な辞書でクエリセットをフィルタリングする場合、それはかなりうまく動作しますdict引数を使用したOR条件のDjangoフィルタ
def cached_query(key, model, my_filter=None, exclude=None, order_by=None, sliced=50):
"""
:param key: string used as key reference to store on Memcached
:param model: model reference on which 'filter' will be called
:param my_filter: dictionary containing the filter parameters (eg.: {'title': 'foo', 'category': 'bar'}
:param sliced: integer limit of results from the query. The lower the better, since for some reason Django Memcached
won't store thousands of entries in memory
:param exclude: dictionary containing the exclude parameters (eg.: {'title': 'foo', 'category': 'bar'}
:param order_by: tuple containing the list of fields upon which the model will be ordered.
:return: list of models. Not a QuerySet, since it was sliced.
"""
result = cache.get(key, None)
if not result:
if my_filter:
result = model.objects.filter(**my_filter)
if exclude:
result = result.exclude(**exclude)
if order_by:
result = result.order_by(*order_by)
else:
result = model.objects.all()
result = result[:sliced]
cache.set(key, result, cache_timeout)
return result
:これは、関数です。しかし、それは必ずしもそうではありません。 OR
条件を必要とするより複雑なクエリに対しては、django.db.models.Q
ユーティリティを使用してフィルタを実行する必要があります。
どのようにこれらのパラメータをフィルタの辞書として渡すことができますか。このためのアプローチはありますか?
'item'キーワードに 'key error'がスローされます。 – Mauricio
申し訳ありませんが、引用符で囲まれています。上記のようにしてください。 –