2014-03-04 41 views
3

类似于这里提出的问题的种类名称:NDB - 独立设置型号名称

Set a kind name independently of the model name (App Engine datastore)

而是为NDB。

我的使用情况如下:

我们修改数据库的代码中使用的数据存储区类型的名称前缀(例如,而不是“轿车”,它使用ModuleName_Car的)。我们现在升级到NDB,并且没有办法将'Car'更改为ModuleName_Car,随后ndb无法读取现有数据。任何解决方法,不涉及命名我的模型'ModuleName_Car(ndb.Model)'?

+0

我发现在NDB(和其他SDK模块)源中窥探比在许多情况下阅读GAE文档更有效。 –

回答

4

NDB Cheat Sheet doc暗示足够(经由_get_kind())到点我this section of the documentation

种类通常是为了其 实体所属(“帐户”在上面的例子中)的模型类的名称,但可以通过覆盖类方法 _get_kind()将 更改为某些其他字符串。

+0

谢谢你应该这样做。 – kkp

0

下面是我对混合db和ndb Models/Keys的具体用例的这个问题的解决方法。

假设为你的数据库类的定义:

class CarModel(db.Model): 
    brand = db.ReferenceProperty(reference_class=Brand) 

而且db.ReferenceProperty品牌标识本身brand.kind()== “my_Brand”。相应ndb.Model可能看起来像:

class CarModel(ndb.Model): 
    brand = KeyProperty(kind="my_Brand") 

这应该解决您的问题,因为MyBrand网正常的那种引用。在我的情况下,我特别想通过ndb.Key,db.Key或db.Model分配字段,然后检索用于查询过滤器和其他数据库的db.Key,将db.Key混合到ndb.Model中匹配逻辑。我子类ndb.KeyProperty处理的行为如下(代码高尔夫球/更正欢迎):

class DbReferenceProperty: 
    @staticmethod 
    def _db_to_ndb_key(entity): 
    if entity is None: 
     return None 
    ndb_key = ndb.Key.from_old_key(entity) if type(entity) == db.Key else ndb.Key.from_old_key(entity.key()) 

    #Overrides ndb.KeyProperty method 
    def _validate(self, value): 
    if not isinstance(value, ndb.Key) and not isinstance(value, db.Key) and not isinstance(value, db.Model): 
     raise TypeError("Unexpected type: %s" % repr(value)) 

    #Overrides ndb.KeyProperty method 
    def _to_base_type(self, value): 
    if isinstance(value, db.Key) or isinstance(value, db.Model): 
     value = DbReferenceProperty._db_to_ndb_key(value) 
    return value 

    #Overrides ndb.KeyProperty method 
    def _from_base_type(self, value): 
    prop_id, kind_str = value.id(), value.kind() 
    db_key = db.Key.from_path(kind_str, prop_id) 
    return db_key 
1

要在大卫的回答

class NdbCredential(ndb.Expando): 
    ... 
    @classmethod 
    def _get_kind(cls): 
     return 'Credential' 

做这项工作扩大。