2013-02-09 178 views
1

我對Python相對較新,來自PHP世界。在PHP中,我會經常取一行,它將對應於數據庫中的對象,稱爲User,並在將用戶對象傳遞給我的查看頁面之前向其添加屬性。 例如,用戶具有屬性電子郵件,名稱和ID。 我從數據庫中獲得5個用戶,並且在for循環中,我爲用戶分配了一個動態屬性,例如圖像。將動態屬性添加到數據存儲對象

這似乎並不在Python /谷歌App Engine數據存儲模型的工作(我認爲它具有比Python的數據存儲模型做多),在for循環中。它可以在for循環中工作(這意味着我可以在for循環中引用user.image,但是一旦for循環結束,所有對象似乎都不再具有新的屬性圖像了。

這是一個代碼示例:

# Model 
Class User(ndb.Model): 
    email = ndb.StringProperty() 
    name = ndb.StringProperty() 


# And then a function that returns a list of users 
users = User.get_users() 

user_list = [] 
# For loop 
for user in user: 
    # For example, get image 
    user.image = Image.get_image(user.key) 
    user_list.append(user) 

    # If I print or log this user in the for loop, I see a result 
    logging.info(user.image) # WORKS! 

for ul in user_list: 
    print ul.image # Results in None/ATTR Error 

我搜索的形式,但我無法找到任何東西給我任何人都可以解釋爲什麼這種情況正在發生,以及如何實現這一目標?

+0

這應該肯定有效。你確定這是確切的代碼嗎?您在第一個和第二個循環之間沒有做任何事情,這可能會導致實例從數據存儲中重新獲取? – 2013-02-10 01:31:53

+0

get_users()可能是一個查詢,在這種情況下,第二個循環將重新獲取沒有動態屬性的用戶。 – 2013-02-10 06:27:39

+0

丹尼爾,你是對的!我的錯誤傢伙,我打印整個對象,出於某種原因(也許你可以解釋),只有原始屬性打印出來。但是,如果我直接調用動態屬性,就像上面那樣(print ul.image),它就可以工作。抱歉! – kevin 2013-02-11 01:03:02

回答

0

嘗試使用Expando Model

有時你不想提前聲明你的屬性。一個 特殊型號的子類,爲Expando,使得分配(只要它不與 下劃線開始)的任何屬性被保存到數據存儲改變其實體 的行爲。

+0

謝謝,謝伊,這是一個可能的解決方案,也許最終會成爲最好的。但是,我對Expando類的理解更多的是將動態屬性放入數據存儲區,而不是添加要在視圖頁上顯示的屬性,對嗎? – kevin 2013-02-09 21:25:57

+0

我試圖避免使用Expando來從數據存儲角度不需要它的類(以避免意外地將屬性放置到不應該有它們的實體的風險) – kevin 2013-02-09 21:28:30