有很多与Ndb allocate_ids()
相关的问题似乎是Ndb中的一个模糊区域,但我发现这个问题无处可去。
使用父/子层次结构时,ids
对于给定的父键应该是唯一的,因此您可以创建
entity_1 = MyEntity(parent=my_parent_key_1, id=23)
entity_2 = MyEntity(parent=my_parent_key_2, id=23)
现在,当您需要为显式赋值分配id时,静态函数MyEntity.allocate_ids()
将父级作为参数。因此,您可以假设带有父参数的allocate_ids()
为给定父级保留一系列ID,而不为任何父级保留。
但是:
MyEntity.allocate_ids(max=1000, parent=ndb.Key(MyParentEntity, 'aaa'))
返回(1L, 1000L)
。分配前1000个ID。现在运行:
MyEntity.allocate_ids(max=1000, parent=ndb.Key(MyParentEntity, 'bbb'))
返回(1001L, 1000L)
,这意味着第一个可用的id是1001L,并且没有分配任何新的,尽管父键是不同的。
现在运行:
MyEntity.allocate_ids(max=2000, parent=ndb.Key(MyParentEntity, 'ccc'))
返回(1001L, 2000L)
,这意味着分配了从1001到2000的ID。
因此看起来allocate_ids
实际上与父键无关。你可能想知道为什么然后将parent_key作为参数传递。
任何人都有此解释,或者可能指向与此奇怪行为相关的文档?
还有一个相关的问题:有没有办法知道通过调用allocate_ids()
后保留了哪个id范围(或范围)?
答案 0 :(得分:1)
我不确定为什么这很重要。 allocate_ids的唯一目的是确保如果您不自己定义完整密钥,GAE不会自动为实体提供某些ID值。它没有做任何其他事情;特别是,它不会对您对这些ID的处理施加任何限制。肯定没有什么可以阻止你,与你在评论中所说的相反,对两种不同的实体类型使用相同的分配ID值。