2011-03-22 65 views
0

我想打印出一個查詢對象的結構,類似於您可以在交互式Python提示符處打印字典或列表的內容。我發現我很難想象數據結構是什麼樣子,這當然會讓模板參數傳遞更難。如何顯示GAE查詢對象的內容和結構?

例如,這裏是一個非常簡單的UserProfile db類,而我試圖打印出所有配置文件以及第二個配置文件的內容。

from google.appengine.ext import db 
from google.appengine.ext import webapp 
from google.appengine.api import users 
from google.appengine.ext.webapp.util import run_wsgi_app 

class UserProfile(db.Model): 
    user = db.UserProperty(auto_current_user_add=True) 
    name = db.StringProperty() 

class TestHandlerBasic(webapp.RequestHandler): 
    def get(self): 
     profiles = UserProfile.all() 
     self.response.out.write('The whole profiles: ') 
     self.response.out.write(profiles) 
     self.response.out.write('<p>') 
     self.response.out.write('Now, print out all profiles: <p>') 
     for profile in profiles: 
      self.response.out.write(profile.user) 
      self.response.out.write('<br>') 
     self.response.out.write('<p>') 
     self.response.out.write('There are this many profiles: ') 
     self.response.out.write(profiles.count()) 
     self.response.out.write('<p>This is the second profile profiles[1]: ') 
     self.response.out.write(profiles[1]) 
     return 

application = webapp.WSGIApplication([(r'/testbasic', TestHandlerBasic),] debug=True) 

我得到這樣的輸出:

整體概況:

現在,打印出的所有模式:

[email protected]
ARD @例子。 com

有這麼多配置文件:2

這是第二個輪廓曲線[1]:

第一線,我得到<google.appengine.ext.db.Query object at 0x490bd10>最後一行我得到<models.UserProfile object at 0x490bb90>後,也是如此。那麼,如何打印Query對象或模型對象的轉儲?

+0

我正在通過克里斯的'BaseModel'參考,看看我可以如何合併到我所做的。另外,http://svn.assembla.com/svn/swewi_javaprograms/swenglish/swewi/common/appenginepatch/appenginepatcher/patch.py​​有一些猴子補丁和一個'__repr__'我需要翻閱的例子。 – 2011-03-23 22:35:03

回答

3

查詢對象本身不包含任何db.Model實體,它們由get()fetch()返回。所以,你將不得不轉UserProfile.all()類似:

profiles = UserProfile.all().fetch(1000) 

我個人喜歡子類db.Model類,並添加一些便利的連載我的模型。我這樣做主要是爲了讓我可以快速獲得實體的JSON表示,但對於傾倒/檢查它們也非常方便。

下面是我的BaseModel擴展的示例,它將__dict____json__方法添加到實體。如果您還添加了轉儲__dict__方法的__repr__,則可以在將實體打印到控制檯時改進實體的字符串表示形式。

+1

使用列表理解不必要的複雜 - 'fetch'已經返回一個列表! – 2011-03-23 00:47:15

+0

謝謝尼克,不知道爲什麼我把它放在那裏。 *更新* – 2011-03-23 08:41:35

+0

我越來越接近使__repr__轉儲字典。我有一個簡單的突破,就是在交互式控制檯'dir(profiles)'中不會打印出任何內容,而是'print dir(profiles)'。 – 2011-03-25 17:52:43