0

重複結構性能我測試以下對象:在AssertionError: 0 != 1NDB查詢由祖先

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

及後續測試失敗:

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'上失敗。

有沒有辦法按結構化屬性的父級查詢?或者我做錯了什麼?我從the docs瞭解到,我在創建時添加了父項屬性。

回答

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() 
+0

好了,是啊,我看它是如何更好地工作。我的第一反應就是這樣做,但後來我被告知父母的關鍵是一個更好的辦法。感謝您提供如此快速的迴應。 – Neara

+0

我的理解是使用祖先關係來完成這些實體的交易。但是,它也會向存儲管理員建議數據存儲在同一個節點或磁盤上。 –