通过序列化密钥获取AppEngine实体

时间:2013-12-19 07:15:49

标签: google-app-engine entity app-engine-ndb

根据Model类的the documentation,我可以使用.get()类函数通过其键从AppEngine数据存储中检索一个或多个实体(Keystring)。我有一个模型Entry

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()应该有额外的类型检查,此时,我真的只是想知道我到底做错了什么。

2 个答案:

答案 0 :(得分: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 :(得分:-1)

要通过密钥ID检索实体,您需要使用此方法调用对象:

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 {}