9

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

4

4 回答 4

29

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

于 2012-04-06T05:12:54.760 回答
28

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

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

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

于 2012-04-05T13:13:09.603 回答
2

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

因此,在给定模型(几乎每个模型)只有一种键的情况下,我喜欢创建一个类方法来生成该键,这增加了一些语义清晰度:

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()

当然,添加的代码并不是绝对必要的,但它增加了清晰度并使我的模型更易于长期维护。

于 2015-05-28T19:51:29.843 回答
0

您可以将 id 解析为键字符串:

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

接着:

result = YourModel.query(YourModel.key== key).get().
于 2019-04-26T06:10:33.413 回答