下面是我对混合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
我发现在NDB(和其他SDK模块)源中窥探比在许多情况下阅读GAE文档更有效。 –