与此处提出的问题类似:
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)'的变通方法?
答案 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