0

私は次のオブジェクトをテストしています:

pk = ndb.Key(League, 'Premier League', 'Season', '2012/13')
o = Team(
    id = 'Chelsea',
    name ='Chelsea',
    leagues = [
       TeamInLeague(
           parent = pk,
           position = 1,
       ),],
)
o.put()

次のテストは失敗しますAssertionError: 0 != 1

q = Team.query(ancestor=pk)
self.assertEqual(q.count(), 1)

私も次のテストを試しました:

q = Team.query(TeamInLeague(ancestor=pk))
self.assertEqual(q.count(), 1)

そしてそれは失敗しAttributeError: type object 'TeamInLeague' has no attribute 'ancestor'ます。

構造化プロパティの親でクエリを実行する方法はありますか?それとも私はそれをすべて間違っていますか?ドキュメントから、作成時に親プロパティを追加することがわかりました。

4

1 に答える 1

1

祖先関係を使用して、必要なことを行うことはできません。

実際、チーム クラスを作成するときに親キーを指定しません。リーグオブジェクトを親としてチームオブジェクトを作成したいですか?

それは次のようになります。

league_k = ndb.Key(League, 'Premier League', 'Season', '2012/13')
o = Team(
    id = 'Chelsea',
    name ='Chelsea',
    parent = league_k
)
o.put()

ただし、そのようにデータモデルに欠陥があります。チームクラスは永久にリーグにリンクされます。リーグには明らかにシーズンが含まれているため、次のシーズンはあなたのチームにアクセスできなくなります。

サンプルコードで既に開始しているため、多対多の関係を使用することをお勧めします。これには、既に行ったように、ヘルパー クラス TeamInLeague の作成が含まれます。その後、通常のクエリ (祖先クエリではない) を使用して、どのチームがどのリーグに属しているかを判断できます。ただし、この場合、特別な TeamInLeague クラスを作成することを検討します。これは、繰り返しプロパティ、特に繰り返し構造化されたプロパティを使用するよりも概念的にクリーンです。

また、コンストラクターですべてのオブジェクト プロパティを指定する必要はありません。これは jQuery ではありません。多くの場合、オブジェクトの作成後、put() の前にオブジェクトの関係を作成する方が読みやすいです。

コードは次のようになります。

league_k = ndb.Key(League, 'Premier League', 'Season', '2012/13')
team = Team(id = 'Chelsea', name ='Chelsea')
o.put()
team_in_league = TeamInLeague(team=team.key(), league=league_k, pos=1)
team_in_league.put()
于 2012-09-16T09:23:23.767 に答える