0

チュートリアルとチャプターの 2 つのモデルがあります。各章には、その章が属するチュートリアルへの重要な参照があります。今、特定のチュートリアルに属するすべての章をリストしようとしていますが、クエリを機能させることができません:

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

GQL 関数は、KEY()エンティティと名前/ID の 2 つのパラメータに基づいてキーを作成するために使用されます。コードを見ると、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 に答える