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 对象作为父对象来创建 Team 对象?

看起来像这样:

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 回答