2013-12-19 36 views
0

根據the documentationModel類,我可以使用.get()類功能通過按鍵來檢索AppEngine上數據存儲的一個或多個實體(如Keystring)。我有一個模型Entry獲得一個實體的AppEngine通過系列化關鍵

class Model(ndb.Model): 
    def to_dict(self): 
    ret = ndb.Model.to_dict(self) 
    ret['key'] = self.key.urlsafe() 
    return ret 

class Entry(Model): 
    text = ndb.StringProperty(required=True) 
    ... 

你會發現我自動添加該實體的關鍵.to_dict()結果我的通用模型子類,所以,當他們序列化到JSON的客戶端,然後送回通過客戶端AJAX調用到服務器,我可以在數據存儲中找到相應的實體(非常簡單,對吧?)。問題是,現在我想通過獲取在Python這些實體與客戶端序列化的鍵:

entries = Entry.get(entryKeys) 

...但我不是接收以下錯誤:

type object 'Entry' has no attribute 'get' 
Traceback (most recent call last): 
    ... 
    File "/home/cbehar/dev/dada/handlers.py", line 126, in post 
    entries = Entry.get(entryKeys) 
AttributeError: type object 'Entry' has no attribute 'get' 

文檔是過時還是我只是在做一些愚蠢的事情?

我覺得這應該是非常簡單的。我可以使用db.get()來代替,但Model.get()應該有額外的類型檢查,並且在這一點上,我真的只想知道我到底做錯了什麼。

回答

1

看起來我實際上正在查看舊數據庫數據存儲的文檔,而不是新的NDB數據存儲。

this handy doc

google.appengine.ext.db   | ndb.model 
----------------------------------------------------------------------- 
MyModel.get_by_key_name('my_key') | MyModel.get_by_id('my_key') 
MyModel.get_by_id(42)    | MyModel.get_by_id(42) 
db.get(key)      | key.get() 
MyModel.get(key)     | key.get() 
db.get(model_instance)    | model_instance.key.get() 
db.get(list_of_keys)    | ndb.get_multi(list_of_keys) 
db.get(list_of_instances)   | ndb.get_multi([x.key for x in 
            |    list_of_instances]) 
MyModel.get_or_insert('my_key', | MyModel.get_or_insert('my_key', 
    parent=model_instance,   | parent=model_instance.key, 
    foo='bar')      | foo='bar') 

所以它看起來像答案是這樣的:

ndb.get_multi(ndb.Key(entryKey) for entryKey in entryKeys) 
-1

要通過你需要打電話給你的對象與此梅索德一個KEYID retreive實體:

ObjectName.get_by_id(int(your key))) 

這是一個完整的例子:

class KeyValueStore(ndb.Model): 
    key_name = ndb.StringProperty(required=True); 
    value = ndb.JsonProperty(required=True) 
    last_record = ndb.DateTimeProperty(auto_now=True) 

    def getDict(self): 
     master = self.to_dict() 
     master["key"] = self.key.id() 
     return master 

    @classmethod 
    def getByKey(cls, key=None): 
     if key != "" and key != None: 
      record = KeyValueStore.get_by_id(int(key)) 
      if record: 
       json = record[0].value 
       return json 
      else: 
       return {} 
     else: 
      return {}