【问题标题】:Since my queryset is a "string query", how can I execute it?由于我的查询集是“字符串查询”,我该如何执行它?
【发布时间】:2013-09-25 03:58:45
【问题描述】:

我在 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 中执行它?

【问题讨论】:

    标签: django django-models memcached django-views


    【解决方案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
    

    【讨论】:

    • 感谢您的分析 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 2016-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    相关资源
    最近更新 更多