我希望有一个名为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的子类。测试失败。
答案 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