我有这两个模型:教程和章节。章节对他们所属的教程有重要的参考。现在,我正在尝试列出属于特定教程的所有章节,但我无法使查询起作用:
class TutView(FuHandler):
def get(self):
tutKey = self.request.get('tut_key')
tut = db.Key.from_path('Tutorial', tutKey)
chaps = db.GqlQuery("SELECT * FROM Chapter " +
"WHERE __key__ = KEY('Tutorial', :1)", tut)
self.render('tutView.html', chaps=chaps)
运行时我收到此错误:
BadArgumentError: Expected an integer id or string name as argument 2;
received datastore_types.Key.from_path(u'Tutorial', u'<bound method
Tutorial.key of <main.Tutorial object at 0x00.............
章节模型:
class Chapter(db.Model):
tutorial = db.ReferenceProperty(Tutorial, collection_name='chapters')
title = db.StringProperty(required=True)
content = db.TextProperty(required=True)
教程模型:
class Tutorial(db.Model):
title = db.StringProperty(required=True)
presentation = db.TextProperty(required=True)
更新: 我设法得到没有错误,但我没有得到任何结果(所以,可能是错的):
chaps = db.GqlQuery("SELECT * FROM Chapter " +
"WHERE __key__ = KEY('tutorial', :1)", str(tutKey))
UPDATE2: 问题可能在于我存储或检索tutKey的方式。我正在获取URL的密钥...而且这可能不起作用......但我不知道其他方式
答案 0 :(得分:2)
您只需使用以下命令即可从密钥返回实体:
chaps = Tutorial.get(tut).chapters
答案 1 :(得分:1)
KEY()
GQL函数用于根据两个参数创建Keys:Entity和name / id。
如果查看代码,您将看到正在将db.Key
对象作为参数传递给它。
因此,错误消息:
Expected an integer id or string name as argument 2;
received datastore_types.Key.from_path(u'Tutorial', ...)
此外,您需要针对tutorial
实体的Chapter
属性进行测试,而不是针对自己的__key__
进行测试。
我不使用GQL,而是使用Query对象。您直接向他们提供db.Key
对象,因此我认为这应该有效:
chaps = db.GqlQuery("SELECT * FROM Chapter " +
"WHERE tutorial = :1", tut)
如果没有,您可以随时尝试:
chaps = db.GqlQuery("SELECT * FROM Chapter " +
"WHERE tutorial = KEY('Tutorial', :1)", tut.id() or tut.name())
答案 2 :(得分:0)
在本地启动应用并运行交互式控制台:
http://127.0.0.1:8080/_ah/admin/interactive
将下面的代码复制并粘贴到控制台中 您可以轻松尝试不同的事情并打印出结果
from google.appengine.ext import db
class Tutorial(db.Model):
title = db.StringProperty(required=True)
presentation = db.TextProperty(required=True)
class Chapter(db.Model):
tutorial = db.ReferenceProperty(Tutorial)
title = db.StringProperty(required=True)
content = db.TextProperty(required=True)
a = Tutorial(title="First tut", presentation="first")
a.put()
print a
print a.key().id()
b = Chapter(tutorial=a, title="tut2", content="lots of words")
b.put()
print b
print b.key().id()
chap = Chapter.all().filter("tutorial =", a).fetch(1000)
for i in chap:
print i.tutorial.title