ユーザー固有のデータを含むすべてのエンティティは、必ずユーザーのエンティティ グループに格納する必要があります。これにより、非祖先クエリよりも優れたパフォーマンスを発揮する祖先クエリを使用して、これらのエンティティを取得および操作できます。
詳細エンティティをユーザーのエンティティ グループの一部にするには、parent
パラメーターを使用してそれらを作成するだけです。例えば:
class TwitterData(db.Model):
twitter_name = db.StringProperty
def addTwitterData(user, twitter_name):
# User is an instance of users.User
new_twitter_entity = TwitterData(parent=user)
new_twitter_entity.twitter_name = twitter_name
new_twitter_entity.put()
これで、次のようにユーザーのデータを取得できます。
twitter_accounts = TwitterData.all().ancestor(user).fetch(1000)
また、種類のない祖先クエリを使用して、ユーザーのエンティティ グループ内のすべてのエンティティを取得できます。
all_networks = db.Query()
all_networks.ancestor(user).fetch(1000)
# Now, ancestor has all of user's Twitter, Facebook, Myspace accounts.
このアプローチの強みの 1 つは、ユーザーがさまざまなサービスのいずれかで複数のアカウントを持つことができることです。
さまざまなソーシャル サイト用に保存する必要があるデータが多すぎて単一の単純なモデルで提供できない場合は、Expandoクラスを使用して、さまざまな種類のデータを保存するエンティティを保存できます。