2012-04-05 69 views
8

我想通过键使用它由数据存储分配的ID加载实体,但我没有看到任何API方法来做到这一点(使用NDB)。我以为我能够从一个整数ID做出一个Key,并使用key.get()来加载实体,但是我没有看到一种方法来从一个id中创建一个键。我怀疑我在这里丢失了一些明显的东西。我应该如何加载一个我只知道它的ID的实体?应用程序引擎ndb - 如何使用ID加载实体的密钥?

回答

23

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

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

不认为你不能得到通过ID的实体不知道的那种,因为不同型号类的实例可以有相同的ID/KEY_NAME

+0

谢谢,这正是我一直在寻找的。不知道我在文档中错过了这些。 – user605331 2012-04-05 14:51:49

+2

我认为文档是错误的,我无法得到这个为我的生活工作,但后来我注意到我传递一个str,以便将长ID转换为一个int做的伎俩,虽然文档引导你相信你可以使用str,至少不会在本地开发应用程序服务器应用程序引擎版本1.8.9上保持真实。一旦我做了一个int(id_str)它工作正常。 – Shaun 2014-02-20 16:13:27

+1

@Shaun我不认为文档是错误的。如果你的id是一个int,那么你将不得不传入一个int,如果它是一个str,那么它必须是一个str。 – aschmid00 2014-02-20 22:30:06

22

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

0

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

确定添加的代码是不是绝对必要的,但它增加了透明度,使我的模型更长远的维护。

相关问题