2011-03-22 26 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

相关问题