在我的简单Google App Engine测试中触发错误

时间:2011-01-17 03:21:20

标签: python google-app-engine

我正在尝试检索存储在DataStore中的已保存Message对象的列表。我收到了这个错误:

  

追踪(最近的呼叫最后):
  文件“C:\ Program Files   (86)\谷歌\ google_appengine \谷歌\ AppEngine上\分机\ webapp__init __。PY”   第515行,致电       handler.get(* groups)文件“C:\ Users \ Sergio \ Downloads \ python-test \ python-test \ gae_test \ handlers.py”,   第23行,在得到       messages = data.get_messages()文件   “C:\用户\塞尔吉奥\下载\蟒测试\蟒测试\ gae_test \ data.py”,   第12行,在get_messages中       dbMessage = db.GqlQuery(“SELECT * FROM Message ORDER BY author DESC”)
  文件“C:\ Program Files   (86)\谷歌\ google_appengine \谷歌\ AppEngine上\分机\ db__init __。PY”   第2296行,在 init 中       model_class = class_for_kind(self._proto_query._entity)   文件“C:\ Program Files   (86)\谷歌\ google_appengine \谷歌\ AppEngine上\分机\ db__init __。PY”   第266行,在class_for_kind中       提出KindError('没有实现种类\'%s \''%种类)KindError:没有   善意'消息'的实现

也许有经验的人可以解释该异常的含义。

这是我的代码:

class MainHandler(BaseHandler):
  def get(self):
    messages = data.get_messages()
    return self.render('index.html', messages=messages)

#This is in data.py
from google.appengine.api import users
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.ext import db

class Message(object):
  def __init__(self, body, author, email, phone):
    self.body = body
    self.author = author
    self.email = email
    self.phone = phone

def get_messages():
  #TODO: Implement
  dbMessage = db.GqlQuery("SELECT * FROM Message ORDER BY author DESC")

  messages =  []  
  for message in dbMessages:
    messages.append(message)

  return messages

  #return [
  #  Message('Hey, how are you doing?', 'Joel Hodgson', 'joel@hogson.com', '847-555-1020'),
  #  Message('Hey there! Love the website.', 'Brian Gordy', 'bg@gordoindustries.com', None),
  #  Message('What is this?', 'Linda Bleeker', None, '415-555-5555'),
  #]

#This is in Index.html:

{% extends "base.html" %}

{% block title %}Messages{% endblock %}

{% block content %}
  <h2>Leave a new message</h2>
  {% include "create.html" %}

  <h2>Existing Messages</h2>
  <div id="list">
    {% include "list.html" %}
  </div>
{% endblock %}

#And this in list.html

<ul id="messages">
  {% for message in messages %}
  <li>
    {{ message.author }}: "{{ message.body }}"
    <span class="contact-info">{{ message.phone }} &bull; {{ message.email }}</span>
  </li>
  {% endfor %}
</ul>

我做错了什么?

谢谢!

4 个答案:

答案 0 :(得分:2)

您可能错过了导入。

要执行gql查询,必须导入它引用的实际模型。

答案 1 :(得分:2)

这是因为在执行查询时尚未加载模型类(在本例中为“消息”)。我在你粘贴的代码段中没有看到它 - 确保它已包含在内,并在执行查询之前导入。

答案 2 :(得分:1)

我没有看到代表Message的元素的Message Class

插入此内容,如果已插入,请通知我

from google.appengine.ext import db

class Message(db.Model): author = db.StringProperty() body= db.StringProperty() phone= db.StringProperty() email = db.StringProperty()

和offcourse应该在DataStore中检索消息

因此您应该使用put方法插入消息,例如在post方法

中的此方案中

message = Message()
message.author = "the author"
message.body = "the body"
message.phone ="phone number"
message.email = "email"
message.put()

答案 3 :(得分:0)

看起来你的Message类没有扩展db.Model或ndb.Model。

此外,这是一个品味问题,我更喜欢使用Message.query()来获取Message类型的所有对象而不是GQL查询。

检查我写的库的测试代码:

模型定义位于:https://github.com/rbanffy/appengine-fixture-loader/blob/master/tests/multi_level_tests.py#L15-L34

&#34; SELECT * FROM Person&#34;等价物:https://github.com/rbanffy/appengine-fixture-loader/blob/master/tests/multi_level_tests.py#L56