2010-11-19 62 views
7

我遇到了一个很大的问题 - 我的数据存储中的多个实体具有相同的ID!他们的密钥是Key s,但我一直假设key.getId()将返回一个在同类实体中唯一的数字。具有相同ID的多个数据存储区实体!

并非如此!不同的密钥可以返回相同的ID! Aurgh!我可以通过使用数据查看器来确认这一点 - 在id/name列中具有相同值的多个实体。具有重复键的实体全部位于不同的实体组中 - 它们具有不同的父键。我还没有在同一个实体组中看到任何重复ID,但我不知道那是不可能发生的。

  1. 这是正常的吗?
  2. 有什么办法可以自动生成唯一的数字标识符吗?我知道我可以提供自己的身份证号码,但必须为此实现我自己的系统似乎极端!

回答

5

一个键不仅包含id或键名 - 它还包括种类,父母和应用程序ID。这就是为什么多个实体可能共享密钥的相同ID部分的原因 - 只要密钥的某些其他组成部分不同,就完全没问题。

如果要生成唯一 ID,请使用db.allocate_ids方法。

+0

实际上,由'db.allocate_ids()'返回的id受到上面提到的完全相同的警告。 – ryan 2011-02-01 05:19:50

1

数据存储标识使用keys的实体(您也可以在keys上看到Java文档,尽管我相信Python文档有更多解释)。关于storage breakdown的文章有点过时了,但仍然有用。

底线是实体通过其在数据存储中的完整路径来标识,这包括实体的父级。因此,要识别孩子,您还需要包含父母的ID。

0

我有同样的问题,并达成了这个话题。我有一个问题,这些ID,因为我用它们来识别HTML,例如这样的实体:

<li id={{ entity.id }}>{{ entity.value }}</li> 

和我是有在DOM重复的ID,但是你给我的答案是:可能数据存储会不一样的父组中重复的ID,作为this part of the documentation说:

“换句话说,一个对象必须有一个ID是跨相同类型的所有 对象,并使用相同的实体是独一无二的组父(如果有 任何)“,

所以我会根据父命名键(可能是一个ID)生成一个id,并使用这个延迟生成的数字来标识DOM上的实体。

蟒蛇:

entity_rs = Entity.all() 
entities = [] 
for entity in entity_rs: 
    entity.id = '%s-%s' % (entity.parent().key().id_or_name(), entity.key().id_or_name()) 
    entities.append(entity): 

HTML:

<ul> 
{% for entity in entities %} 
    <li id="{{ entity.id }}">{{ entity.value }}</li> 
{% endfor %} 
</ul> 

我知道这是不是漂亮,但是(在一定条件下),它的工作原理。

相关问题