2010-06-07 49 views
1

我有以下模型結構AppEngine上

class User(db.Model) : 
nickname = db.StringProperty(required=True) 
fullname = db.StringProperty(required=True) 

class Article(db.Model) : 
title = db.StringProperty(required=True) 
body = db.StringProperty(required=True) 
author = db.ReferenceProperty(User, required=True) 

class Favorite(db.Model) : 
who = db.ReferenceProperty(User, required=True) 
what = db.ReferenceProperty(Article, required=True) 


我想根據該圖案來顯示10米最後製品加入最愛系統暱稱),如果這篇文章已經被登錄用戶收藏了,

我加入,我用只用一個查詢(it is described here

得到這些文章的作者的功能,但我不知道如何處理收藏做(我想知道顯示的文章已被我使用少於10個查詢(我想顯示10篇文章)收藏))。可能嗎?

+0

問題:您的收藏夾類有作者參考。我的猜測是,作者的意思是指做這個人的人,而不是那個寫這篇文章的人。我對麼? – 2010-06-07 17:35:50

+0

是的,你是對的 – 2010-06-07 17:50:40

+0

事實上,類作者是用來存儲所有用戶 – 2010-06-07 17:57:48

回答

2

實際上,你可以用攤銷0查詢成本做到這一點,如果你非規範化數據的詳細!將favorites屬性添加到Authors,其中存儲了用戶已收藏的文章的鍵列表。然後,您可以通過簡單地查看此列表來確定文章是否是用戶的最愛。

如果您在用戶首次登錄時檢索此收藏夾列表並將其存儲在用戶的會話數據中(並在用戶添加/刪除收藏夾時將其更新),那麼您不必查詢數據存儲區檢查項目是否是最愛。


建議更新到Authors型號:

class Authors(db.Model): # I think this would be better named "User" 
    # same properties you already had ... 
    favorites = db.ListProperty(db.Key, required=True, default=[]) 

當用戶登錄時,只是緩存他們的收藏夾列表中的會話數據:

session['favs'] = user.favorites 

然後當你展示最新的文章,你可以通過查看每篇文章的關鍵字是否在您已經緩存的收藏夾列表中來檢查它們是否是最喜歡的(或者您可以動態查詢收藏夾列表,但是有r最後不需要)。

favs = session['favs'] 
articles = get_ten_latest_articles() 
for article in articles: 
    if article.key() in favs: 
     # ... 
+0

謝謝您的建議。這是我想的解決方案。 – 2010-06-07 20:10:44

0

dound的替代解決方案是將收藏文章的發佈日期存儲在收藏夾條目上。然後,在查詢時簡單地按此排序。

1

我認爲還有一個解決方案。

讓我們將'自動增量'字段添加到用戶和文章類。

然後,當我們想向Favorite類中添加一個條目時,我們還將以我們能夠知道的格式添加鍵名稱,使其具有登錄用戶和文章的自動遞增值,如'用戶ID '+ id_of_the_user +' 條款ArticleID'+ id_of_an_article。

然後,當涉及到顯示時,我們將輕鬆預測收藏夾的關鍵名稱,並且可以使用Favorite.get_by_key_name(key_names)。