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 オブジェクトを Father オブジェクトとして保存していたことにありました。GAE は、Father オブジェクト (私のアプリケーションでは) のプロパティが少ないにもかかわらず、喜んで実行してくれました。保存されているデータから Model.properties() にない値を (黙って) 削除したため、GAE は文句を言いませんでした。

不適切なタイプの保存を修正し、保存されていない余分な値のチェックを追加しました (これは、チェックが行われるはずの 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)でインポート エラー ( PolyModelis not in module ) で終了するだけです。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()

...予想通り「スポーンがこんにちは」と表示されます。どの App Engine リリースを使用していますか? 私が提供しているコードを正確に使用するとどうなりますか?

于 2009-09-25T05:17:55.500 に答える
-1

「Father.get...」を実行したため、Father クラスからオブジェクトを作成しました。では、なぜ「父がこんにちは」と言わないのでしょうか。

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")

ニール・ウォルターズ

于 2009-09-25T02:47:39.610 に答える