2010-11-19 9 views
7

Tengo un gran problema: ¡varias entidades en mi almacén de datos del mismo tipo tienen el mismo ID! Sus claves son Key s, pero asumo que key.getId() devolverá un número que es único entre todas las entidades del mismo tipo.¡Múltiples entidades de almacén de datos con la misma ID!

¡No es así! ¡Diferentes claves pueden devolver la misma identificación! Aurgh! Puedo confirmar esto usando el visor de datos: múltiples entidades con el mismo valor en la columna id/name. Las entidades con claves de repetición están todas en diferentes grupos de entidades, tienen diferentes claves principales. No he visto ninguna identificación repetida dentro del mismo grupo de entidades, pero no sé si eso no puede suceder.

  1. Es esto normal?
  2. ¿Hay alguna manera de obtener automáticamente un identificador numérico único? Entiendo que podría proporcionar mis propios valores de identificación, ¡pero tener que implementar mi propio sistema para esto parece extremo!

Respuesta

5

Una clave incluye más que el nombre de la identificación o clave, también incluye el tipo, padre (s) e identificación de la aplicación. Esta es la razón por la que varias entidades podrían compartir la misma porción de ID de la clave; está perfectamente bien siempre que difiera algún otro componente de la clave.

Si desea generar un único id, utilice el método db.allocate_ids.

+0

en realidad, los ids devueltos por 'db.allocate_ids()' están sujetos a las mismas advertencias que usted menciona anteriormente. – ryan

1

El almacén de datos identifica las entidades que usan keys (también puede ver los documentos de Java en keys, aunque creo que los documentos de Python explican un poco más). El artículo en storage breakdown está un poco desactualizado, pero también es útil.

La conclusión es que las entidades se identifican por su ruta completa en el almacén de datos, esto incluye el elemento principal de la entidad. Entonces, para identificar al niño, también deberá incluir la identificación del padre.

0

Tengo el mismo problema y he llegado a este tema. Estaba teniendo un problema con estas identificaciones, porque he usado para identificar las entidades de este tipo en el HTML, ejemplo:

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

y yo estaba teniendo ID duplicados en el DOM, pero me dio la respuesta: Probablemente el almacén de datos no repetirá los ID dentro del mismo grupo de padres, como se ha dicho en this part of the documentation:

"en otras palabras, un objeto debe tener un identificador que es único en todos los objetos del mismo tipo y con la misma entidad padre del grupo (si es alguno) ",

, así que generaré una identificación basada en la clave con nombre principal (podría ser una ID) y usaré este número generado por latencia para identificar la entidad en el DOM.

pitón:

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> 

Yo sé que no es bonito, pero (bajo ciertas condiciones) funciona.

Cuestiones relacionadas