我想要做的是构建一些使用uri保存页面的迷你cms。
我的urls.py中的最后一个路由指向我的views.py中的一个函数,该函数检查数据存储区中是否有可用当前请求的相同uri的页面,如果是,则显示该页面。
我有一个模特:
class Page(db.Model):
title = db.StringProperty(required=True)
uri = db.TextProperty(required=True)
created = db.DateTimeProperty(auto_now_add=True)
modified = db.DateTimeProperty(auto_now=True)
content = db.TextProperty()
在我看来:
def show(request):
page = db.GqlQuery('SELECT * FROM Page WHERE uri=:uri', uri=request.path).get()
if page is None:
return http.HttpResponseNotFound()
else:
return respond(request, 'pages_show', {'content': request.path})
我已经在数据存储区添加了一个带有'/ work'的实体作为uri。
即使request.path正好是'/ work',查询也不会返回匹配项。
感谢你给我的任何建议!
是的,我是一个python noob,App Engine是最终学习语言的完美选择。
答案 0 :(得分:4)
我找到了解决方案!
问题在于模型。
App引擎数据存储区不会为TextProperty编制索引。从一开始就使用该类型是错误的,所以我将其更改为StringProperty,它确实被索引,因此哪个数据存储允许我们在WHERE子句中使用。
工作模式示例:
class Page(db.Model):
title = db.StringProperty(required=True)
// string property now
uri = db.StringProperty(required=True)
created = db.DateTimeProperty(auto_now_add=True)
modified = db.DateTimeProperty(auto_now=True)
content = db.TextProperty()
答案 1 :(得分:2)
如果使用命名关键字参数(“uri =:uri”),则必须将参数显式绑定到命名关键字。而不是:
# incorrect named parameter
GqlQuery('SELECT * FROM Page WHERE uri=:uri', request.path).get()
你想要
# correct named parameter
GqlQuery('SELECT * FROM Page WHERE uri=:uri', uri=request.path).get()
或者您可以使用位置参数:
# correct positional parameter
GqlQuery('SELECT * FROM Page WHERE uri=:1', request.path).get()