Python NDB:如何对实体组中的实体使用get_by_id

Python NDB:如何对实体组中的实体使用get_by_id,python,google-app-engine,app-engine-ndb,Python,Google App Engine,App Engine Ndb,我正在使用get_by_id()从NDB中读取实体,但对于属于实体组的实体,我无法使其工作: from google.appengine.ext import ndb class Folder(ndb.Model): name = ndb.StringProperty() parent_folder_key = Folder(name = 'Parent folder').put() sub_folder_key = Folder(name = 'Subfolder', pa

我正在使用get_by_id()从NDB中读取实体,但对于属于实体组的实体,我无法使其工作:

from google.appengine.ext import ndb

class Folder(ndb.Model):
    name = ndb.StringProperty()

parent_folder_key = Folder(name = 'Parent folder').put()    
sub_folder_key = Folder(name = 'Subfolder', parent=parent_folder_key).put() 

id_list = []
print 'All folders:'
for f in Folder.query():
  print f
  id_list.append(f.key.id())

print '\nFolders by id:'
for id in id_list:
  print Folder.get_by_id(id)
输出:

All folders:
Folder(key=Key('Folder', 5814), name=u'Parent folder')
Folder(key=Key('Folder', 5814, 'Folder', 5815), name=u'Subfolder')

Folders by id:
Folder(key=Key('Folder', 5814), name=u'Parent folder')
None
是设计的还是一个bug?我以前在使用名称空间时(我使用的是SDK 1.6.6),看到了与get_by_id()相关的一些问题。如何从id获取具有父项的文件夹?

get\u by\u id(id,parent=None)
采用父项参数。
在实体组中按id查询时,必须包含父项才能获得所需的实体


即使有父项,id也是唯一的,因此我不理解为什么即使这里有父项,也不可能通过id获取实体。id仅对特定实体组是唯一的。id只是键的一部分,还包括父实体。get_by_id需要重建完整的实体键才能获取实体。谢谢您aschmid00。我理解这一点的方式是,没有父母和祖先的实体形成了他们自己的实体群。如果是这种情况,则整个模型类的ID必须是唯一的。我错了吗?据我所知,如果您不想创建一个具有自定义id的实体,那么您需要首先构造一个完整的密钥,并将其用于该实体。通过这样做,您已经创建了一个特定的实体组
Key(kind1,id1)
,因此每当您在密钥构造函数中设置kind1时,它将是相同的实体组,并且id必须是唯一的。在不指定父级或键的情况下,GAE会自动将模型类设置为其实体组。你需要自己尝试一下,因为我不完全确定,但有足够的信心它是这样工作的。相信我,当有父母的时候,ID不是唯一的。密钥中的所有信息都是唯一标识实体所必需的。从层次上讲,这归结为:应用程序;名称空间;顶层类;顶层id;儿童类;子id。(如果存在多个级别的祖先,则必须包括所有级别。)