我遇到了一个很大的问题 - 我同类数据存储区中的多个实体具有相同的ID!它们的键是Key
s,但我一直假设key.getId()将返回一个在同类所有实体中唯一的数字。
不是这样!不同的密钥可以返回相同的ID! Aurgh!我可以通过使用数据查看器来确认这一点 - 在id / name列中具有相同值的多个实体。具有重复键的实体都在不同的实体组中 - 它们具有不同的父键。我没有在同一个实体组中看到任何重复ID,但我不知道这不会发生。
答案 0 :(得分:5)
密钥不仅包括id或密钥名称 - 它还包括种类,父级和应用程序ID。这就是为什么多个实体可能共享密钥的相同ID部分 - 只要密钥的某个其他组件不同,它就完全没问题。
如果您要生成唯一 ID,请使用db.allocate_ids
方法。
答案 1 :(得分:1)
数据存储使用keys识别实体(您还可以在keys上看到Java文档,但我相信Python文档可以解释一下)。关于storage breakdown的文章有点过时,但仍然有用。
底线是实体由数据存储区中的完整路径标识,包括实体的父级。因此,要识别孩子,您还需要包含父母的ID。
答案 2 :(得分: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>
我知道它不漂亮,但(在某些条件下)它有效。