代码之家  ›  专栏  ›  技术社区  ›  Riley Lark

多个具有相同ID的数据存储实体!

  •  9
  • Riley Lark  · 技术社区  · 15 年前

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

    不是这样!不同的密钥可以返回相同的id!奥格!我可以使用data viewer来确认这一点,在id/name列中使用具有相同值的多个实体。具有重复键的实体都位于不同的实体组中—它们具有不同的父键。我没有在同一个实体组中看到任何重复的id,但我不知道这不可能发生。

    1. 这正常吗?
    2. 是否有任何方法可以自动生成唯一的数字标识符?我知道我可以提供我自己的id值,但必须实现我自己的系统,这似乎是极端的!
    3 回复  |  直到 15 年前
        1
  •  6
  •   David Underhill    15 年前

    密钥不仅包括id或密钥名,还包括种类、父项和应用程序id。这就是为什么多个实体可能共享密钥的同一个ID部分的原因——只要密钥的其他组件不同,就完全可以了。

    如果要生成 独特的 id,使用 db.allocate_ids 方法。

        2
  •  1
  •   Robert Kluin    15 年前

    数据存储使用 keys (您还可以在 keys ,不过我相信Python文档解释得更多一些)。关于 storage breakdown 有点过时,但仍然有用。

    归根结底,实体是由它们在数据存储中的完整路径标识的,这包括实体的父级。因此,要识别孩子,还需要包含家长的id。

        3
  •  0
  •   fiatjaf    14 年前

    我也遇到了同样的问题,并谈到了这个话题。我对这些ID有问题,因为我使用它们来标识HTML中的此类实体,例如:

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

    我在DOM上有重复的id,但是你给了我答案:可能数据存储不会在同一个父组中重复id,如上所述 this part of the documentation :

    “换句话说,一个对象必须有一个在所有对象中唯一的ID 具有相同实体组父级的同类对象(如果 “任何”,

    因此,我将基于父名key(可能是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>
    

    我知道它不漂亮,但(在某些情况下)它能用。