下面是我對混合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文檔更有效。 –