2013-05-31 23 views
14

我利用ndb的to_dict方法將對象的屬性轉換爲python字典。從一切我可以說,這種方法不包括字典中的對象的鍵或家長按文件:ndb to_dict方法不包含對象的鍵

https://developers.google.com/appengine/docs/python/ndb/modelclass#Model_to_dict

但是我的情況,我需要的關鍵是在字典。我的首選是利用內建方法並將其子類化或類似,而不是創建我自己的to_dict方法。

什麼是最好的方法來完成這個或我缺少明顯的東西?提前致謝。

僅供參考:我沒有爲這個項目利用django,而是直接將python部署到gae。

回答

29

你不會錯過任何;-)

只需將鍵添加到在調用to_dict的字典,是覆蓋的方法。

如果您有多個模型與您的自定義to_dict不共享相同的基類,我會將它作爲一個mixin來實現。

將to_dict定義爲Mixin類的方法。你會

class ModelUtils(object): 
    def to_dict(self): 
     result = super(ModelUtils,self).to_dict() 
     result['key'] = self.key.id() #get the key as a string 
     return result 

然後使用它。

class MyModel(ModelUtils,ndb.Model): 
    # some properties etc... 
+0

謝謝Tim!完美工作。我是python的新手,不知道如何重寫提到的方法。除非您願意編輯您的答案並提供一些指導,否則我可以將其作爲另一個問題發佈。我很欣賞這個快速反應,並且通過你在這裏的所有其他答案享受了你的學習。 –

+0

查看編輯的示例。 –

+0

Danke先生。 –

2

另一種簡單的方法來實現這一(而不必重寫to_dict)是添加ComputedProperty返回的ID,如下所示:

class MyModel(ndb.Model): 

    # this property always returns the value of self.key.id() 
    uid = ndb.ComputedProperty(lambda self: self.key.id(), indexed=False) 

    # other properties ... 

ComputedProperty將被添加到的to_dict結果就像任何其他財產一樣。

只是有兩個限制:

  1. 顯然,屬性的名稱不能key(因爲這將與實際密鑰發生衝突)和id也不管用。
  2. 如果在創建對象時沒有指定鍵或標識符,這將不起作用。

而且,計算值將被寫入到數據存儲,當你調用put(),因此它消耗你的一些存儲空間。

一個優點是,它支持to_dict()開箱即用的參數includeexclude

+0

由於密鑰尚未定義,因此在初始創建實體時似乎不起作用。我得到這個錯誤:'uid = ndb.ComputedProperty(lambda self:self.key。id()) AttributeError:'NoneType'對象沒有屬性'id'' – Stetzon

+0

正確,這就是我在答案中的約束#2的意思。創建對象時必須分配一個鍵才能完成此項工作。至少在我的用例中,這不是問題。 – Marten

+0

是的,我發佈我的評論後,我幾乎發現它。第一次通過時必須錯過你的筆記。感謝您的澄清。我可以通過[分配和分配](https://cloud.google.com/appengine/docs/python/ndb/creating-entity-keys#allocating_ids)該實體的密鑰來實現該功能,以便初始_put_ – Stetzon