app engine ndb - 如何使用id按键加载实体?

时间:2012-04-05 12:36:25

标签: google-app-engine google-cloud-datastore

我正在尝试使用数据存储区分配的ID按密钥加载实体,但我没有看到任何api方法(使用NDB)。我以为我可以从一个整数id创建一个Key并使用key.get()来加载实体,但是我没有看到从一个id创建一个键的方法。我怀疑我在这里遗漏了一些明显的东西。我应该如何加载一个我只知道它的id的实体?

4 个答案:

答案 0 :(得分:26)

YourModel.get_by_id()通过id获取模型实例。

这里的文档:
https://developers.google.com/appengine/docs/python/ndb/modelclass#Model_get_by_id

不认为在不知道类型的情况下你不能通过id获取实体,因为不同Model类的实例可以具有相同的id / key_name

答案 1 :(得分:26)

另一种方式:ndb.Key(YourModel, id).get()

答案 2 :(得分:1)

NDB中的模型不会将其键类型定义为模型的一部分。这很漂亮,因为您可以拥有一个可通过多种不同类型的键和父项访问的给定模型类型,这使它们更加灵活。但这有点问题,因为它并不总是很清楚键代表什么或它来自何处。

因此,对于给定模型(几乎每个模型)只有一个类型的密钥,我喜欢创建一个用于生成该模型的类方法key,增加了一点语义清晰度:

class Book(ndb.Model):
  title = ndb.StringProperty()
  pages = ndb.IntegerProperty()
  @classmethod
  def make_key(cls, isbn):
    return ndb.Key(cls, isbn)

b = Book.make_key('1234-5678').get()

当然,添加的代码并非绝对必要,但它增加了清晰度,使我的模型更具长期可维护性。

答案 3 :(得分:0)

您可以将ID解析为密钥字符串:

%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${sys:PID} --- [%15.15t] %-40.40logger{1.} : %m%n%wEx

然后:

key = ndb.Key(YourModel, id).urlsafe().