Google App Engine基础和子类获取

时间:2012-11-14 19:13:55

标签: python google-app-engine

我希望有一个名为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. 什么是解决方法?

2 个答案:

答案 0 :(得分:3)

模型由它们的“种类”定义,而子类是另一种类型,即使它看起来是相同的。

子类化的重点不是共享值,而是分享您为给定“种类”创建的“模式”。

在基类ndb.Model上创建了一个种类地图(因为您提到ndb),似乎您正在使用get_by_id,当您执行此类查询时会查找每种类型的地图

对于子类,类型只是defined作为类名:

@classmethod
def _get_kind(cls):
  return cls.__name__

答案 1 :(得分:1)

我刚刚发现GAE有一个解决方案。它被称为PolyModel:

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

相关问题