0

我有这两个模型:教程和章节。章节对它们所属的教程有一个重要的参考。现在我试图列出属于特定教程的所有章节,但我无法让查询工作:

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 的密钥......这可能不起作用......但我不知道其他方式

4

3 回答 3

2

您不需要查询即可从键返回实体,只需使用:

chaps = Tutorial.get(tut).chapters 
于 2013-01-16T17:22:49.267 回答
1

KEY()GQL 函数用于基于两个参数创建密钥:实体和名称/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())
于 2013-01-16T21:28:29.707 回答
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
于 2013-01-16T20:39:26.393 回答