1

いくつかの事前定義されたプロパティを持つ MBUser という基本クラスが必要です。これらのプロパティは変更したくないものです。クライアントが MBUser にプロパティを追加する場合は、MBUser をサブクラス化し、追加のプロパティをそこに配置することをお勧めします。

API コードは、クライアントが実際に MBUser をサブクラス化するかどうかを認識しませんが、問題にはなりません。ID で MBUser を取得するだけでよいと考えていました。だから私はこれがうまくいくと思っていました:

def test_CreateNSUser_FetchMBUser(self):
    from nsuser import NSUser
    id = create_unique_id()
    user = NSUser(id = id)
    user.put()
    # changing MBUser.get.. to NSUser.get makes this test succeed
    get_user = MBUser.get_by_id(id)
    self.assertIsNotNone(get_user)

ここで、NSUser は MBUser のサブクラスです。テストは失敗します。

  1. なぜ私はこれを行うことができないのですか?
  2. 回避策は何ですか?
4

2 に答える 2

3

モデルは「種類」によって定義され、サブクラスは同じように見えても別の種類です。

サブクラス化のポイントは、値を共有することではなく、特定の「種類」に対して作成した「スキーマ」を共有することです。

種類マップは基本クラス上に作成され(前述のようndb.Modelに使用しているようです)、このようなクエリを実行すると各種類が検索されます。ndbget_by_id

サブクラスの場合、種類はクラス名として定義されます。

@classmethod
def _get_kind(cls):
  return cls.__name__
于 2012-11-14T19:27:34.567 に答える
1

GAE がこれに対する解決策を持っていることを発見しました。これは PolyModel と呼ばれます。

https://developers.google.com/appengine/docs/python/ndb/polymodelclass

于 2012-11-14T22:39:45.040 に答える