Несколько объектов хранилища данных с одинаковым идентификатором! - PullRequest
9 голосов
/ 19 ноября 2010

У меня огромная проблема - несколько сущностей в моем хранилище данных одного и того же вида имеют одинаковый идентификатор!Их ключи Key s, но я предполагаю, что key.getId () вернет число, уникальное для всех сущностей одного и того же вида.

Не так!Разные ключи могут возвращать один и тот же идентификатор!Aurgh!Я могу подтвердить это с помощью средства просмотра данных - несколько объектов с одинаковым значением в столбце id / name.Все сущности с ключами повторения находятся в разных группах сущностей - у них разные родительские ключи.Я не видел никаких повторных идентификаторов в одной и той же группе сущностей, но я не знаю, что это не может произойти.

  1. Это нормально?
  2. Есть ли способ получить уникальныйчисловой идентификатор автоматически генерируется?Я понимаю, что могу предоставить свои собственные значения идентификаторов, но необходимость в реализации собственной системы для этого кажется чрезвычайной!

Ответы [ 3 ]

5 голосов
/ 19 ноября 2010

Ключ включает в себя больше, чем просто идентификатор или имя ключа - он также включает в себя тип, родительский (ые) и идентификатор приложения. Вот почему несколько объектов могут совместно использовать одну и ту же часть идентификатора ключа - это прекрасно, если какой-то другой компонент ключа отличается.

Если вы хотите создать уникальный идентификатор, используйте метод db.allocate_ids.

1 голос
/ 19 ноября 2010

Хранилище данных идентифицирует сущности, используя ключи (вы также можете увидеть документы Java на ключи , хотя я считаю, что документы Python объясняют немного больше).Статья о поломке хранилища немного устарела, но все еще полезна.

Суть в том, что сущности идентифицируются по их полному пути в хранилище данных, включаяродитель сущности.Поэтому, чтобы идентифицировать ребенка, вам нужно будет также указать его идентификатор.

0 голосов
/ 28 января 2012

У меня такая же проблема и я дошел до этой темы.У меня были проблемы с этими идентификаторами, потому что я использовал их для идентификации сущностей такого рода в HTML, например:

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

, и у меня были дублированные идентификаторы в DOM, но вы дали мне ответ: вероятно, хранилище данных не будет повторять идентификаторы в той же родительской группе, как сказано в этой части документации :

"Другими словами, объект должен иметь идентификатор, которыйявляется уникальным для всех объектов одного и того же типа и с одним и тем же родителем группы сущностей (если есть) ",

, поэтому я сгенерирую идентификатор на основе родительского именованного ключа (может быть идентификатором) и использовать этот ленивый номер, чтобы идентифицировать сущность в DOM.

python:

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>

Я знаю, что это не красиво,но (при определенных условиях) это работает.

...