2014-03-04 50 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' 

做這項工作擴大。