Google app engine 应用程序引擎ndb-如何使用id按键加载实体?

Google app engine 应用程序引擎ndb-如何使用id按键加载实体?,google-app-engine,google-cloud-datastore,Google App Engine,Google Cloud Datastore,我正在尝试使用数据存储分配的id按键加载实体,但我没有看到任何api方法可以这样做(使用NDB)。我想我可以从一个整数id生成一个键,并使用Key.get()加载实体,但我看不到从一个id生成键的方法。我怀疑我在这里遗漏了一些明显的东西。我应该如何加载一个我只知道其id的实体?YourModel.get\u by\u id()按id获取模型实例 这里是文档: 不要认为在不知道实体类型的情况下无法通过id获取实体,因为不同模型类的实例可以具有相同的id/key\u名称。另一种方法是:ndb.ke

我正在尝试使用数据存储分配的id按键加载实体,但我没有看到任何api方法可以这样做(使用NDB)。我想我可以从一个整数id生成一个键,并使用Key.get()加载实体,但我看不到从一个id生成键的方法。我怀疑我在这里遗漏了一些明显的东西。我应该如何加载一个我只知道其id的实体?

YourModel.get\u by\u id()
按id获取模型实例

这里是文档:


不要认为在不知道实体类型的情况下无法通过id获取实体,因为不同模型类的实例可以具有相同的id/key\u名称。另一种方法是:
ndb.key(YourModel,id).get()

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

确保添加的代码不是严格必需的,但它增加了清晰度并使我的模型更易于长期维护。

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

key = ndb.Key(YourModel, id).urlsafe().
然后:

result = YourModel.query(YourModel.key== key).get().

谢谢,那正是我想要的。我不知道我怎么会在文档中漏掉它。我认为文档是错误的,我无法让它在我的一生中发挥作用,但后来我注意到我传递了一个str,所以将长id转换为int就成功了,尽管这些文档让您相信您可以使用str,但这并不正确,至少在本地dev app server app engine版本1.8.9上是如此。有一次我做了一个int(id_str),效果很好。@Shaun我不认为文档是错的。如果你的id是
int
,那么你必须通过
int
,如果是
str
,那么它必须是
str
。这可能是公平的,但我认为id总是很长的?密钥是字符串?id可以是字符串或int/long。您的选择。与接受答案中的键查找相比,这有几个缺点:您有一个额外的(可计费的)查询数据存储操作,结果最终不是很一致,