【问题标题】:Getting an AppEngine entity by serialized key通过序列化键获取 AppEngine 实体
【发布时间】:2013-12-19 16:02:33
【问题描述】:

根据Model 类的the documentation,我可以使用.get() 类函数通过键(如Keystring)从AppEngine 数据存储中检索一个或多个实体。我有一个模型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() 应该有额外的类型检查,在这一点上,我真的只想知道我到底做错了什么。

【问题讨论】:

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


    【解决方案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)
    

    【讨论】:

      【解决方案2】:

      要通过 keyID 检索实体,您需要使用以下方法调用对象:

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

      【讨论】:

        猜你喜欢
        • 2021-05-14
        • 2020-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-20
        • 1970-01-01
        相关资源
        最近更新 更多