3

Google App Engine NDB でエンティティとキーがどのように機能するか理解できません。

私はpostエンティティとエンティティを持っていuserます。user_keyを に設定するにはどうすればよいpostですuserか?

対話型コンソールでは、これまでのところ次のようになっています。

from google.appengine.ext import ndb
from app.lib.posts import Post
from app.lib.users import User
from random import shuffle

users = User.query()
posts = Post.query().fetch()

for post in posts:
  post.user_key = shuffle(users)[0]
  post.put()

開発用のシードデータをセットアップしようとしています。これはおそらく物事を設定する理想的な方法ではないことはわかっていますが、私の最初の質問は次のとおりです。

  1. エンティティからキーを取得するにはどうすればよいですか (逆はドキュメントに記載されています)
  2. ndb で関連付けを設定するにはどうすればよいですか?
4

3 に答える 3

2

おそらく、これは NDB を理解するのに役立ちます。私はあなたと同じ質問をしました。

class Person(ndb.Expando):
    pass

class Favourite(ndb.Expando):       
    pass

class Picture(ndb.Expando):
    pass

person  = Person()
person.put()
picture = Picture()
picture.put()
fav = Favourite(parent=person.key,
        person=person.key,
        picture=picture.key
        )
fav.put()
于 2013-01-07T11:18:10.397 に答える
2

試す:

post.user_key = shuffle(users)[0].key
于 2013-01-07T08:38:46.753 に答える
0
  1. この場合、User.query() がリストではなく iter を返すため、シャッフルが機能することを確認します。(shuffle( [ x for x in users ] を使用してリストに変換できます)。このリストは長すぎる可能性があることに注意してください。
  2. NDB には非常に複雑な動作がある場合があるため、NDB キーを格納しないことをお勧めしますが、ext.db と互換性のあるシリアル化された文字列を格納することをお勧めします: post.user_key = shuffle( [ x for x in users ] ).key. URLセーフ()
  3. 関連付けには KeyProperty を使用できます。リレーションをよりきめ細かく制御する必要がある場合は、それらを自分で実装する必要があります。https://developers.google.com/appengine/docs/python/ndb/properties#structuredを参照してください
于 2013-01-07T09:35:13.200 に答える