2

ここに私のモデルがあります:

class User(db.Model):
    id = db.StringProperty(required=True)
    created = db.DateTimeProperty(auto_now_add=True)
    updated = db.DateTimeProperty(auto_now=True)
    name = db.StringProperty(required=True)
    email = db.StringProperty()

class Page(db.Model):
    id = db.StringProperty(required=True)
    created = db.DateTimeProperty(auto_now_add=True)
    updated = db.DateTimeProperty(auto_now=True)
    name = db.StringProperty(required=True)
    link = db.StringProperty(required=True)

class UserPage(db.Model): 
    user = db.ReferenceProperty(User, collection_name='pages') 
    page = db.ReferenceProperty(Page, collection_name='users')

ユーザーのページを見つけるためのクエリを作成するにはどうすればよいですか?

それを行う方法を説明している記事を見つけましたが、これが最善の方法ですか? http://blog.arbingersys.com/2008/04/google-app-engine-better-many-to-many.html

4

3 に答える 3

3

あなたの答えは機能しますが、データストアに対して 7 回の呼び出しを実行します。

  • User.get_by_key_name() の呼び出しの場合は 1
  • UserPage...fetch() の呼び出しの場合は 1
  • ループ内の x.page.id の逆参照ごとに 5

データストアへの呼び出しを 3 回だけ行う別のアプローチは、次のようになります。

myuser = User.get_by_key_name("1") 
up = UserPage.all().filter('user =', myuser).fetch(5)
keys = [UserPage.page.get_value_for_datastore(x) for x in up]
pages = db.get(keys)
for p in pages: 
     self.response.out.write(p.id)

詳細については、 http://blog.notdot.net/2010/01/ReferenceProperty-prefetching-in-App-Engineを参照してください。

于 2010-09-09T01:43:20.280 に答える
1

UserPage私は別のアプローチをお勧めします。それはあなたの関係よりも「関係志向」ではありません。

class User(db.Model):
    id = db.StringProperty(required=True)
    created = db.DateTimeProperty(auto_now_add=True)
    updated = db.DateTimeProperty(auto_now=True)
    name = db.StringProperty(required=True)
    email = db.StringProperty()

class Page(db.Model):
    id = db.StringProperty(required=True)
    created = db.DateTimeProperty(auto_now_add=True)
    updated = db.DateTimeProperty(auto_now=True)
    name = db.StringProperty(required=True)
    link = db.StringProperty(required=True)

    # Users linking to this page
    users = db.ListProperty(db.Key)

そして、次のクエリを使用して、特定のユーザーのすべてのページを取得できます。

Page.gql("WHERE users = :1", user.key())

キーのlistプロパティは、アイテムが少なくなると予想される側に配置する必要があることに注意してください。ユーザーにリンクされているページよりも、ページを好むユーザーが少ないと想定しているので、Page横に置いておきますが、それは特定のユースケースによって異なります。

多対多のトピックに関する公式の推奨事項については、こちらをご覧ください:http ://code.google.com/appengine/articles/modeling.html

于 2010-09-14T21:17:33.170 に答える
1

いくつかのテストの後、私は使用できるようです:

 myuser = User.get_by_key_name("1")
 up = UserPage.all().filter('user =', myuser).fetch(5)
 for x in up:
     self.response.out.write(x.page.id)
于 2010-09-07T14:43:42.707 に答える