2012-11-14 68 views
1

我想要一个名为MBUser的基类,它具有一些预定义的属性,我不想更改这些属性。如果客户想要将属性添加到MBUser,则建议MBUser被子类化,并且将其中的任何其他属性放在该处。Google App Engine基础和子类获取

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. 什么是解决方法?

回答

3

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

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

一类地图是在基类ndb.Model创建(好像你正在使用ndb既然你提到get_by_id),当你做这样的查询每一种是抬头。

对于子类,一种是刚刚defined类名:

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