我正在尝试在我的Google App Engine应用中使用memcache。我决定只重写我的Model的all()类方法,而不是创建一个检查memcache然后查询数据库的函数。到目前为止,这是我的代码:
def all(cls, order=None):
result = memcache.get("allitems")
if not result or not memcache.get("updateitems"):
logging.info(list(super(Item, cls.all())))
result = list(super(Item, cls).all()).sort(key=lambda x: getattr(x, order) if order else str(x))
memcache.set("allitems", result)
memcache.set("updateitems", True)
logging.info("DB Query for items")
return result
我认为这样可行。但相反,我得到一个RuntimeError,说超出了递归深度。我认为这来自于对super()方法的误解。很抱歉,因为订购的东西混乱了代码。但也许问题也存在于那里。我找到的一个地方说应该像这样调用super方法:
super(supercls, cls_or_self)
但这不适用于GAE的API:
super(db.Model, cls)
这不知道要查询哪个模型。有人请告诉我我做错了什么,也许让我更好地了解super()。
编辑:感谢@Matthew,问题在第一次 logging.info()
电话中被证明是错误的括号。现在我有另一个问题,该方法只是返回None。我不知道这是否意味着super
的{{1}}实现返回None(也许它不知道实体正在调用它?)或者我的代码中还有其他一些错误。< / p>
答案 0 :(得分:0)
我认为错误可能在这里:
logging.info(list(super(Item, cls.all())))
如果cls.all()
中出现错误,则将其作为<{1}}构造函数的一部分再次调用 ,而不是在结果上调用它:
super
因此,如果错误再次调用logging.info(list(super(Item, cls).all()))
,它仍会满足日志记录分支条件,这将再次调用all
,这仍然等等,直到您达到递归限制。
另一个可能的问题是all
会返回Query
个对象,而我不确定Model.all()
是否有效。它还提供了自己的排序,因此您可以使用它:
list(query)
或只是 query = super(Item, cls).all()
query.order( order )
...
return list(query)
,因为它已经可以迭代了。