NDB - 独立于型号名称设置种类名称

时间:2014-03-04 19:25:29

标签: google-app-engine python-2.7

与此处提出的问题类似:

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

,而是NDB。

我的用例如下:

我们修改了我们的db代码,以便为数据存储类型名称使用前缀(例如,而不是'Car',它使用ModuleName_Car)。我们现在正在升级到NDB,并且无法将“Car”更改为ModuleName_Car,随后ndb无法读取现有数据。任何不涉及命名我的模型'ModuleName_Car(ndb.Model)'的变通方法?

2 个答案:

答案 0 :(得分:4)

NDB Cheat Sheet doc暗示(通过_get_kind())指向我this section of the documentation

  

该种类通常是模型类的名称   实体所属(上例中的“帐户”),但可以   通过覆盖classmethod改为其他字符串   _get_kind()。

答案 1 :(得分:0)

这里是我如何针对混合db和ndb模型/密钥的特定用例来解决这个问题。

假设您的db类定义为:

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

db.ReferenceProperty Brand用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