2010-11-19 59 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> 

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

相關問題