1

這是my previous question的後續行動。如何使用ReferenceProperty訪問模型中的項目?

我設置的機型的ReferenceProperty:

class User(db.Model): 
    userEmail = db.StringProperty() 

class Comment(db.Model): 
    user = db.ReferenceProperty(User, collection_name="comments") 
    comment = db.StringProperty(multiline=True) 

class Venue(db.Model): 
    user = db.ReferenceProperty(User, collection_name="venues") 
    venue = db.StringProperty() 

在數據存儲我有在用戶此項:

Entity Kind: User 
Entity Key: ag1oZWxsby0xLXdvcmxkcgoLEgRVc2VyGBUM 
ID: 21 
userEmail: [email protected] 

並下設地點:

Entity Kind: Venue 
Entity Key: ag1oZWxsby0xLXdvcmxkcgsLEgVWZW51ZRhVDA 
ID: 85 
venue (string): 5 star venue 
user (Key): ag1oZWxsby0xLXdvcmxkcgoLEgRVc2VyGBUM 
User: id=21 

我想在hw.py這樣的項目中顯示

query = User.all() 
    results = query.fetch(10) 
    self.response.out.write("<html><body><ol>") 
    for result in results: 
     self.response.out.write("<li>") 
     self.response.out.write(result.userEmail) 
     self.response.out.write(result.venues) 
     self.response.out.write("</li>") 
    self.response.out.write("</ol></body></html>") 

這條線的工作原理:

 self.response.out.write(result.userEmail) 

,但此行不工作:

 self.response.out.write(result.venues) 

但作爲per vonPetrushev's answerresult.venues應該抓住這個userEmail相關的venue

對不起,如果這是令人困惑:我只是試圖訪問連接到userEmailReferenceProperty表。鏈接表是VenueComment。如何訪問VenueComment中的項目?謝謝。

回答

3

venues實際上是一個query對象。所以你需要獲取或迭代它。

嘗試用循環替換self.response.out.write(result.venues)行:

query = User.all() 
users = query.fetch(10) 
self.response.out.write("<html><body><ol>") 
for user in users: 
    self.response.out.write("<li>") 
    self.response.out.write(user.userEmail) 
    self.response.out.write("<ul>") 
    # Iterate over the venues 
    for venue in user.venues: 
     self.response.out.write("<li>%s</li>" % venue.venue) 
    self.response.out.write("</ul></li>") 
self.response.out.write("</ol></body></html>") 

然而,這不會很好地進行縮放。如果有10個用戶,它將運行11個查詢!確保您使用Appstats來查找像這樣的性能問題。儘量減少您所做RPC調用的次數。

更好的解決方案可能是將用戶的電子郵件非規範化並存儲在Venue類中。這樣,您只需要一個查詢即可打印場地信息和用戶電子郵件。

+0

感謝您的回答。考慮到你提到的性能問題,我決定將`latestVenue`屬性添加到`User`,現在我將它顯示爲`result.latestVenue`。但是我也將它作爲`ReferenceProperty`保存在`Venue`下供以後使用。我認爲這樣更好。再次感謝你的幫助。 – Zeynel 2010-11-30 21:47:52

相關問題