当我运行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按预期工作,现在我按照指示使用它。 :)
答案 0 :(得分: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版本?如果您使用我正在给出的代码会发生什么?
答案 1 :(得分:-1)
你做了一个“Father.get ...”所以你从Father类创建了一个对象。 那么为什么不说“父亲说你好”。
如果您的父级有姓氏和名字,并且您的Son级别具有中间名,除非您专门检索“Son”记录,否则您将无法获得中间名。
如果你想做一个多态类型查询,这是一种方法。我知道它适用于属性,但没有尝试使用方法。
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")
Neal Walters