2011-03-28 65 views
0

我已經讀了很多關於我如何需要重新考慮實施實體和AppEngine上開發時加入,我仍然無法弄清楚如何做到這一點:3個模型實體的AppEngine加入Python的

我有3個實體。 標籤有很多推文用戶關注很多標籤

我想獲取所有標記爲用戶關注的標籤的推文。

我想消除標籤實體和使用StringListProperty可能的工作,因爲這:

Tweets.all().filter(‘tag IN」, user.tags) 

然而,在所示的ListProperty documentations,這是不行的!因爲查詢無法比較兩個列表。

查詢無法比較兩個列表值。沒有辦法測試兩個列表是否相等,而不分別測試每個元素的成員資格。

不知道如何結構,以我能回答這個問題的實體:

如何獲得該標記有標籤,用戶遵循所有的鳴叫?

感謝

+0

這個Google I/O對話很好地涵蓋了這個主題。我相信他會回顧一下他將如何在App Engine中實現類似twitter的服務:http://www.youtube.com/watch?v = AgaL6NGpkB8 – Calvin 2011-03-28 23:09:01

回答

1

你不是要比較兩個表 - 你檢查交集。您列出的查詢將執行此操作,但有一個主要警告:將IN篩選器拆分爲多個子查詢,後者由後端獨立執行,最多有30個子查詢。

也就是說,如果您的用戶如下3個標籤[「富」,「酒吧」,「巴茲」],上面做的是等效的聯合:

Tags.all().filter('tag =', 'foo') 
Tags.all().filter('tag =', 'bar') 
Tags.all().filter('tag =', 'baz') 
+0

有趣。所以我的查詢實際上可以工作,但它會很昂貴?問題是,如果它會按照你的解釋執行,那麼所有的推文都不會被整理出來?是否有上述信息的文檔?非常感謝! – mkhatib 2011-03-29 23:33:22

+0

@Mhamhammad正確。 「所有的推文不會被整理」是什麼意思? – 2011-03-30 12:09:13

+0

我的意思是說,您所提出的三個查詢中的累計推文將不會被整體排序,例如在創建日期?我必須在記憶中這樣做,對吧? – mkhatib 2011-03-30 15:30:16

0

你應該在管理找到這個article實體關係有幫助。

由於每個Tweet可以有多個標籤,因此您需要遵循本文的「多對多」部分。您可能想要爲用戶和標籤之間的關係做同樣的事情。然後,這將爲您提供一種有效的方式來獲取與用戶相關的標籤對應的所有推文。

+0

我已經看過這段時間了。並且我理解如何在AppEngine實體中實現多對多關係,並且已經通過其他幾個項目完成了這些關係。但我仍然無法弄清楚如何相交3個多對多關係。 – mkhatib 2011-03-29 23:29:36