由于我的查询集是“字符串查询”,我该如何执行它?

时间:2013-09-25 03:58:46

标签: django django-models memcached django-views

我在Django中使用memcached,但在某些情况下我需要使用低级缓存api。所以我想创建一个让事情变得简单的功能:

def store_cache(key,query,time):

   if cache.get(key):
      return cache.get(key)
  else:
      result = **# execute query that was passed in parameter #** 
      cache.set(key,result,time)
      return result

此函数将被称为:

store_cache("my_key", "MyUser.get.objects.all.filter(x = y)", 500)

我的问题...由于我的查询集是“字符串查询”,如何在函数store_cache中执行它?

1 个答案:

答案 0 :(得分:1)

这不是设计该API的最佳方式,因为您要求的是使用eval(),而您并不真的想要这样,因为eval()是邪恶的并且编码围绕eval的应用程序并不安全。

更好的方法是:

def myobject_cache(key, query, time):

   data = cache.get(key)
   if data:
      return data
  else:
      result = list(CustomObjectThatHoldsLotsOfQuerySets.get(query))
      cache.set(key, result, time)
      return result

class CustomObjectThatHoldsLotsOfQuerySets(object):
    def get(key):
        if key == "MyObject":
            return MyObject.objects.filter(x=y)
        #do other stuff here