【发布时间】:2016-06-30 19:17:40
【问题描述】:
我的 Django 应用程序上有一个函数,我在其中执行一些 Queryset 操作并将其结果设置为 Memcache。因为它是一个函数,所以它必须是通用的。因此,为了使其可重用,我将 dict 作为filter 和exclude 操作的参数传递。这是函数:
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
如果我使用像{'title': 'foo', 'name': 'bar'} 这样的简单字典过滤查询集,它会很好地工作。然而,情况并非总是如此。对于需要OR 条件的更复杂查询,我需要使用django.db.models.Q 实用程序执行过滤器。
那么,如何将这些参数作为字典传递给过滤器。有什么办法吗?
【问题讨论】: