2012-07-21 14 views
5

Sorum şu: Yeni bir model öğesi oluşturmanın en iyi yolu nedir ve sonra hemen okuyun. Örneğin,Yeni bir model varlığını nasıl oluşturabilirim ve sonra hemen okuyabilir miyim?

class LeftModel(ndb.Model): 
    name = ndb.StringProperty(default = "John") 
    date = ndb.DateTimeProperty(auto_now_add=True) 

class RightModel(ndb.Model): 
    left_model = ndb.KeyProperty(kind=LeftModel) 
    interesting_fact = ndb.StringProperty(default = "Nothing") 

def do_this(self): 
    # Create a new model entity 
    new_left = LeftModel() 
    new_left.name = "George" 
    new_left.put() 

    # Retrieve the entity just created 
    current_left = LeftModel.query().filter(LeftModel.name == "George").get() 

    # Create a new entity which references the entity just created and retrieved 
    new_right = RightModel() 
    new_right.left_model = current_left.key 
    new_right.interesting_fact = "Something" 
    new_right.put() 

Bu oldukça sık gibi bir istisna atar:

AttributeError: 'NoneType' object has no attribute 'key' 

yani Yeni LeftModel öğesinin geri alınması başarısız oldu. Ben bu problem ile appengine birkaç kez karşılaştım ve benim çözüm her zaman biraz hacky olmuştur. Genellikle, her şey bir denemeye veya varlığın başarılı bir şekilde alıncaya kadar bir süre içinde kullanılmasına izin verir. Model varlığının her zaman sonsuz döngü risklerini (while döngüsünde) çalıştırmadan veya kodumu karıştırmadan (denemeler dışında denemeler durumunda) alınmasını nasıl sağlayabilirim?

+1

otomatik olarak oluşturulmuş olanı kullanmak yerine oluşturulduğunda LeftModel için bir anahtar ayarlamanız yeterlidir. –

+1

+1 iyi belirtilen sorun – msw

cevap

9

Nesneyi, put()'u gerçekleştirdikten hemen sonra bir sorgu aracılığıyla getirmeye çalışıyorsunuz.

Sen new_left Yeni oluşturduğunuz kullanabilir ve hemen new_right.left_model = current_left.key

sorgulayabilir edemez nedeni olarak new_right aktarmayı unutmayın İKG sen put neden demektir nihai bir tutarlılık modeli kullanması nedeniyle hemen geçecek olmasına görünür durumda olmak. Tutarlı bir sonuç almak istiyorsanız, atalarının sorgularını yapmalısınız ve bu, yaratılıştaki anahtarda bir ataya işaret eder. Bir ağaç yarattığınız düşünüldüğünde, bu muhtemelen pratik değildir. Güçlü Tutarlılık için Verilerin Yapılandırılması hakkında bilgi edinin https://developers.google.com/appengine/docs/python/datastore/structuring_for_strong_consistency

Yeni oluşturduğunuz varlığı yalnızca ek sorgu olmadan kullanmamanın herhangi bir nedenini göremiyorum.

+0

+1 Yükseltmek için: "Hemen sonra nasıl okuyabilirim?" Yapamazsınız, bu NDB'nin bir tasarım hedefi değildir ve hemen kullanılabilir olmaması için iyi bir sebep vardır. – msw

+7

Açıklığa kavuşturmak için: bu nedenin NDB ile ilgisi yoktur - bu HRD sorgu semantiği arka planda uygulanır. NDB sadece kötü haberlerden geçiyor. (OP'nin bunu neden denediğine gelince: Benim tahminlerim kadar iyidir, ama örnekte bunun gerçekleştiği gerçek kodla karşılaştırıldığında basitleştirilmesini ve/veya bir çeşit test yazmasını beklerim; SQL deyimlerini App Engine'e çeviriyordu.) –

İlgili konular