基于anses的重复结构属性NDB查询

2024-03-28 11:22:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在测试以下对象:

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上失败:

^{pr2}$

我还尝试了以下测试:

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

它在AttributeError: type object 'TeamInLeague' has no attribute 'ancestor'上失败。在

有没有方法可以按结构化属性的父级进行查询?还是我做错了?我从the docs了解到我在创建时添加父属性。在


Tags: 对象keynameid属性teamseasonpk
1条回答
网友
1楼 · 发布于 2024-03-28 11:22:13

你不能用祖先关系来做你想做的事。在

事实上,您在创建团队类时并不提供父键。我猜你想用联盟对象作为父对象来创建团队对象吗?在

应该是这样的:

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

但是,像这样的话,你的数据模型会有一个缺陷。团队班将永远与联盟联系在一起。由于联赛显然有一个赛季,你的球队下赛季将无法进入。在

最好使用多对多关系,因为您已经在示例代码中开始了。这将涉及到创建一个helper类TeamInLeague,正如您已经做的那样。然后,您可以使用普通查询(而不是祖先查询)来确定哪个团队属于哪个联盟。但是,在本例中,我会考虑创建一个特殊的TeamInLeague类。这在概念上比使用重复属性(尤其是重复的结构化属性)更干净。在

另外,不需要在构造函数中指定所有对象属性。这不是jQuery。在许多情况下,在创建对象之后和put()之前创建对象关系更具可读性。在

您的代码如下所示:

^{pr2}$

相关问题 更多 >