2011-02-26 61 views
2

我有4個嵌套類,見例如:Python的泡菜丟失數據

class GameInfo: 
    id = "" 
    round = "" 
    # ... etc 

class Opponent: 
    game_info = GameInfo() 
    name = "" 
    # ... 

class Tournament: 
    opponent_list = [] # list of Opponent objects 
    # ... 

class Journal(db.Model): 
    picked_tournament = db.BlobProperty() # here I put picked Tournament object 

的問題是:當我在Journal unpickle pickled_tournamentGameInfo的所有數據都將丟失。即opponent.name顯示正確的值,但opponent.game_info.id顯示空字符串。

我使用Google App Engine數據存儲來存儲數據,picked_tournament存儲在BlobProperty()中。要序列化數據,我調用:journal.picked_tournament = pickle.dumps(tournament)。加載我使用的數據:tournament = pickle.loads(journal.picked_tournament)

爲什麼醃菜不會超過2級?

UPD:數據設置如下:

gi = GameInfo() 
gi.id = "1234" 
opp = Opponent() 
opp.name = "John" 
opp.game_info = gi 
t = Tournament() 
t.opponent_list.append(opp) 
# etc... 

UPD2:剛發現一切正常開發服務器上的罰款,如果數據庫是sqlite3的,但沒有sqlite3的和Appspot上不起作用!

+1

你不告訴我們在哪兒以及如何設置game_info.id – systempuntoout 2011-02-26 21:37:25

+0

@systempuntoout game_info.id設置自然,看到更新 – rmflow 2011-02-26 22:44:15

+0

你有沒有嘗試過的情況下直接通過Journal.picked_tournament去(這是一個分貝取儲存錦標賽鹹菜。 BlobProperty)?這可能會幫助你找出問題(可能是BlobProperty的事情)。 – aknuds1 2011-02-26 22:47:13

回答

3

在您的Opponent類的構造函數中,實例化一個GameInfo的副本,該副本由該類的所有實例使用。例如:

>>> o1 = Opponent() 
>>> o1.game_info.id = 5 
>>> o2 = Opponent() 
>>> o2.game_info.id 
5 

相反,您需要爲每個Opponent實例創建一個。通過初始化它在構造函數中,像這樣做:

class Opponent: 
    def __init__(self): 
     game_info = GameInfo() 

而且,由於它不是20世紀90年代,你真的應該使用new style classes

+0

一旦我將game_info的初始化移動到Opponent的構造函數中,問題就消失了(由我自己解決,但感謝您在問題中清除它) – rmflow 2011-02-28 08:15:50

1

基於App Engine文檔(我還沒有在實踐中嘗試過),嘗試設置鹹菜數據作爲BLOB:

journal.picked_tournament = db.Blob(pickle.dumps(tournament)) 

如果這不起作用,驗證journal.picked_tournament == pickle.dumps(比賽)。