Python 如何在查询中使用引用键?

Python 如何在查询中使用引用键?,python,google-app-engine,google-cloud-datastore,Python,Google App Engine,Google Cloud Datastore,我有两个模型:教程和章节。各章对它们所属的教程有重要参考。现在,我试图列出属于特定教程的所有章节,但我无法使查询正常工作: class TutView(FuHandler): def get(self): tutKey = self.request.get('tut_key') tut = db.Key.from_path('Tutorial', tutKey) chaps = db.GqlQuery("SELECT * FROM Chap

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

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 Tutorial(db.Model):
    title = db.StringProperty(required=True)
    presentation = db.TextProperty(required=True)

更新: 我没有出错,但没有结果(因此,可能是错误的):

更新2:
问题可能在我存储或检索tutKey的过程中。我正在用URL获取密钥。。。而且这可能不起作用。。。但我不知道其他方法

您不需要查询就可以从key返回实体,只需使用:

chaps = Tutorial.get(tut).chapters 

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

chaps = Tutorial.get(tut).chapters 

在本地启动应用程序并运行交互式控制台:

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

在本地启动应用程序并运行交互式控制台:

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
KEY()
GQL函数用于基于两个参数创建键:实体和名称/id。 如果查看代码,您将看到您正在将一个
db.Key
对象作为参数传递给它。 因此,错误消息:

Expected an integer id or string name as argument 2; 
received datastore_types.Key.from_path(u'Tutorial', ...)
此外,您还需要针对
章节
实体的
教程
属性进行测试,而不是针对其自身的
\uuuuuuu键
进行测试

我不使用GQL,而是使用查询对象。您直接为他们提供了
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())
KEY()
GQL函数用于基于两个参数创建键:实体和名称/id。 如果查看代码,您将看到您正在将一个
db.Key
对象作为参数传递给它。 因此,错误消息:

Expected an integer id or string name as argument 2; 
received datastore_types.Key.from_path(u'Tutorial', ...)
此外,您还需要针对
章节
实体的
教程
属性进行测试,而不是针对其自身的
\uuuuuuu键
进行测试

我不使用GQL,而是使用查询对象。您直接为他们提供了
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())


请发布db.Model类。将
\uuuuuu key\uuuu
替换为
章节
为什么?Chapter没有任何名为“chapters”的属性。请发布db.Model类。将
\uuuu key\uuuu
替换为
chapters
为什么?Chapter没有任何称为“chapters”的属性??这只是给了我一个教程,我已经知道了。我需要具有此教程的referenceProperty的章节模型教程没有chapters属性。但我得到以下错误:AttributeError:“NoneType”对象没有属性“chapters”,这是因为get不返回任何实体请确保密钥有效??这只是给了我一个教程,我已经知道了。我需要具有此教程的referenceProperty的章节模型教程没有chapters属性。但我得到了以下错误:AttributeError:“NoneType”对象没有属性“chapters”,这是因为get不返回任何实体确保密钥有效到底是什么?我也在做同样的事情但是。。。在数据存储中,对中章节的引用是“Tutorial:name=#”,但当我在控制台上发布此代码而不是“name=”时,我得到了“Tutorial:id=#”嗯?也许改变一下模特的名字?(或者启动一个空的应用程序)它确实有效,你至少可以从一个简单的@MFONTOURA开始,这到底是怎么回事?我也在做同样的事情但是。。。在数据存储中,对中章节的引用是“Tutorial:name=#”,但当我在控制台上发布此代码而不是“name=”时,我得到了“Tutorial:id=#”嗯?也许改变一下模特的名字?(或者启动一个空的应用程序)它确实有效,你至少可以从一些简单的@mFontoura开始