2013-04-02 72 views
2

下面的完整工作示例可以在交互式控制檯中運行。將空列表分配給具有默認值的StringListProperty會導致實體具有默認值?

這是預期嗎?如果是這樣,我有兩個問題:

1)請在GAE文檔中說明其解釋位置。

2)請顯示db.Model的模式,該模式在創建時默認爲某個屬性的填充列表,但仍然允許我們稍後分配空列表(或無)。

from google.appengine.ext import db 

class TestClass(db.Model): 
    my_string_list = db.StringListProperty(default=['foo', 'bar']) 

instance = TestClass() 
instance.put() 

print instance.my_string_list 
#['foo', 'bar'] 

instance.my_string_list = [] 
instance.put() 
print instance.my_string_list 
#[] 

instance2 = db.get(instance.key()) 
print instance2.my_string_list 
#expected [], got ['foo', 'bar'] ??? 
+0

奇怪的是,它周圍的東西看起來像是存儲在數據存儲中的一個空列表,但是當它讀回來時,它的默認值被放回。也許是GAE的錯誤?我會在問題跟蹤器 – someone1

+0

上完成一個問題:https://code.google.com/p/googleappengine/issues/detail?id=9098&thanks=9098&ts=1364912386 – HorseloverFat

+0

雖然這很奇怪,但通常不好主意可變對象作爲默認參數。 –

回答

0

這可能是值得注意的是,與NDB(較新的數據存儲區API),反覆的,必需和默認是mutally排斥。也就是說,不能有重複屬性的默認值(如StringListProperty)。也許你需要重新設計,而不是使用默認值,做一個功能讓你的模型的一個新實例:

from google.appengine.ext import db 

class TestClass(db.Model): 
    my_string_list = db.StringListProperty(default=[]) 

    @classmethod 
    def get_new_instance(cls): 
     entity = cls() 
     entity.my_string_list = ['foo', 'bar'] 
     return entity 

這一切都是假設你開了bug報告不會一會兒加以解決。如果他們不支持NDB,可能會變成與舊的DB API類似的情況。