0

当我像这样运行 Google App Engine 时:

 from google.appengine.ext import db
 from google.appengine.ext.db import polymodel

 class Father(polymodel.PolyModel):
      def hello(self):
          print "Father says hi"

 class Son(Father):
      def hello(self):
          print "Spawn says hi"

当我跑步时,例如

 s = Son()
 s.put()

 son_from_father = Father.get_by_id(s.key().id())

 son_from_father.hello()

这将打印“父亲打招呼”。我希望这会打印出“儿子打招呼”。有谁知道如何做到这一点,在这里?

编辑

最终,问题是我将 Spawn 对象保存为父亲对象。即使父对象(在我的应用程序中)具有较少的属性,GAE 也很乐意这样做。GAE 没有抱怨,因为我(默默地)从正在保存的数据中删除了任何不在 Model.properties() 中的值。

我已经修复了不正确的类型保存并添加了对未保存的额外值的检查(这有助于检查应该发生的 TODO 注释)。保存时我对数据所做的检查基本上是:

def save_obj(obj, data, Model):
   for prop in Model.properties(): # checks/other things happen in this loop
      setattr(obj, prop, data.get(prop))

   extra_data = set(data).difference(Model.properties())
   if extra_data:
      logging.debug("Extra data!")

这里的帖子很有帮助-谢谢。GAE 按预期工作,现在我按照指示使用它。:)

4

2 回答 2

1

我无法重现您的问题 - 实际上,您的代码在我的 GAE(版本 1.2.5)上因导入错误(PolyModel不在模块中)而死。db一旦我修复了足以让代码运行的东西......:

import wsgiref.handlers
from google.appengine.ext import webapp
from google.appengine.ext.db import polymodel

class Father(polymodel.PolyModel):
    def hello(self):
        return "Father says hi"

class Son(Father):
    def hello(self):
        return "Spawn says hi"

class MainHandler(webapp.RequestHandler):

  def get(self):
    s = Son()
    s.put()
    son_from_father = Father.get_by_id(s.key().id())
    x = son_from_father.hello()
    self.response.out.write(x)

def main():
  application = webapp.WSGIApplication([('/', MainHandler)],
                                       debug=True)
  wsgiref.handlers.CGIHandler().run(application)


if __name__ == '__main__':
  main()

...我按预期看到“Spawn 打招呼”。您有什么 App Engine 版本?如果您完全使用我提供的代码会发生什么?

于 2009-09-25T05:17:55.500 回答
-1

你做了一个“Father.get...”,所以你从父类创建了一个对象。那么为什么不说“父亲打招呼”。

如果您的父亲类有姓氏和名字,而您的儿子类有中间名,那么除非您专门检索“儿子”记录,否则您将不会获得中间名。

如果你想做一个多态类型查询,这里有一种方法。我知道它适用于属性,但没有尝试过方法。

 fatherList = Father.all().fetch(1000) 
 counter = 0 
 #I'm using lower case father for object and upper case Father for your class...
 for father in fatherList:
     counter += 1 
     if isinstance(father,Son):
        self.response.out.write("display a Son field or do a Son method") 
     if isinstance(father,Daughter):
        self.response.out.write("display a Daughter field or do a Daughter method")

尼尔·沃尔特斯

于 2009-09-25T02:47:39.610 回答