2010-11-19 21 views
7

Büyük bir sorunum var - aynı türdeki veri mağazamdaki birden fazla varlık aynı kimliğe sahip! Anahtarları Key s'dir, ancak key.getId() öğesinin aynı türdeki tüm varlıklar arasında benzersiz bir sayı döndüreceğini varsayardım.Aynı kimliğe sahip birden çok veri girişi var!

Öyle değil! Farklı tuşlar aynı kimliği döndürebilir! Aurgh! Bunu veri görüntüleyici - kimlik/ad sütununda aynı değere sahip birden fazla varlık kullanarak onaylayabilirim. Tekrarlama tuşlarına sahip varlıklar, farklı varlık gruplarındadır - farklı ana anahtarlara sahiptirler. Aynı varlık grubunda hiç tekrarlama görmedim, ancak bunun gerçekleşemeyeceğini bilmiyorum.

  1. Bu normal midir?
  2. Otomatik olarak oluşturulmuş benzersiz bir sayısal tanımlayıcı elde etmenin bir yolu var mı? Kendi kimlik değerlerimi sağlayabileceğimi anlıyorum, ama bunun için kendi sistemimi uygulamak zorunda kalmak aşırı görünüyor!

cevap

5

Anahtar, yalnızca kimlik veya anahtar adından daha fazlasını içerir - ayrıca tür, üst öğe ve uygulama kimliğini de içerir. Bu nedenle birden fazla varlık potansiyel olarak anahtarın aynı ID bölümünü paylaşabilir - anahtarın diğer bazı bileşenleri farklı olduğu sürece gayet iyi.

benzersiz bir kimliği oluşturmak istiyorsanız, db.allocate_ids yöntemini kullanın.

+0

aslında, db.allocate_ids() ile döndürülen ids, yukarıda bahsettiğiniz tam olarak aynı uyarılara tabidir. – ryan

1

Veri deposu, keys kullanarak öğeleri tanımlar (Python belgelerinin biraz daha açıkladığına inanıyorum, ancak Java belgelerini keys'da da görebilirsiniz). storage breakdown'daki makale biraz güncel değil ama yine de faydalı.

En alt satır, varlıkların veri deposundaki tam yollarıyla tanımlanmış olmasıdır; bu, varlığın üst ailesini içerir. Bu nedenle çocuğu tanımlamak için ebeveynin kimliğini de eklemeniz gerekir.

0

Aynı sorunu yaşıyorum ve bu konuya ulaştım. HTML, örnekte bu tür kuruluşlar tanımlamak için kullandım çünkü bu kimliklerinin bulunduğu bir sorunu vardı:

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

ve DOM yinelenen kimlikleri başlamıştı, ama bana bir cevap verdi: muhtemelen this part of the documentation söylediği gibi veri deposu, aynı ana grup içindeki kimlikleri yinelenmeyecektir:

diğer bir deyişle

", aynı türden tüm nesneler arasında ve aynı varlıkla benzersiz bir kimliği olması gereken bir nesnenin grup üst grubu ( varsa) ",

böylece ad adında bir anahtara dayalı bir kimlik üreteceğim (kimlik olabilir) ve DOM'deki varlığı tanımlamak için bu tembel oluşturulmuş sayıyı kullanacağım.

piton:

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> 

I (belirli koşullar altında) güzel olmadığını biliyorum ama işe yarıyor.

İlgili konular