2009-04-29 44 views
0

我正在嘗試我的第一個谷歌應用引擎項目 - 一個簡單的球員統計數據庫,我參與了一個運動隊。鑑於此型號:更新谷歌應用引擎中的數據

class Player(db.Model): 
    """ Represents a player in the club. """ 

    first_name = db.StringProperty() 
    surname = db.StringProperty() 
    gender = db.StringProperty() 

我想創建一個用於創建和修改播放器的基本Web界面。我的代碼結構看起來是這樣的:

class PlayersPage(webapp.RequestHandler): 
    def get(self): 
     # Get all the current players, and store the list. 
     # We need to store the list so that we can update 
     # if necessary in post(). 
     self.shown_players = list(Player.all()) 

     # omitted: html-building using django template 

此代碼生成由表格和一張桌子的一個非常基本的HTML頁面。該表有一個行對每個球員,看起來像這樣的事情:

<tr> 
    <td><input type=text name="first_name0" value="Test"></td> 
    <td><input type=text name="surname0" value="Guy"></td> 
    <td><select name="gender0"> 
     <option value="Male" selected>Male</option> 
     <option value="Female" >Female</option> 
     </select></td> 
    </tr> 
    <!-- next row: first_name1, etc. --> 

我的想法是,我會存儲我self.shown_players使用的播放器實例,因此,如果必要,我可以在以後更新的玩家我post()(同一類)的方法做:

def post(self): 
    # some code skipped 

    for i, player in enumerate(self.shown_players): 
     fn = self.request.get('first_name'+str(i)).strip() 
     sn = self.request.get('surname'+str(i)).strip() 
     gd = self.request.get('gender'+str(i)).strip() 
     if any([fn != player.first_name, 
       sn != player.surname, 
       gd != player.gender]): 
      player.first_name = fn 
      player.surname = sn 
      player.gender = gd 
      player.put() 

然而,這不起作用,因爲self.shown_playerspost()方法被調用不存在。我想應用程序引擎每次訪問頁面時都會創建一個新的類實例。

我嘗試了相同的想法,但將shown_players放在課程或模塊級別(並將其稱爲global),但由於我無法理解的原因,這不起作用。 例如:

shown_players = [] 
class PlayersPage(webapp.RequestHandler): 
    def get(self): 
     # Get all the current players, and store the list. 
     # We need to store the list so that we can update 
     # if necessary in post(). 
     global shown_players 
     shown_players[:] = list(Player.all()) 

shown_players似乎具有內get()權值,因爲HTML生成正確的,但它是內post()空。

我該怎麼辦?

編輯:謝謝,所有。答案(「再次檢索玩家!」)應該是顯而易見的:-)也許我會看看memcache的某一天,但我不希望玩家名單在不久的將來會超過30人..

回答

2

在每個請求上,您正在處理同一個類的新實例。這就是爲什麼你不能在get()中創建一個可擴展存儲庫,並在post()中使用它的值。你可以做的是在你的post()-方法中再次檢索值,或者將數據存儲在memcache中。

參見內存緩存,這裏的文檔:

http://code.google.com/intl/de-DE/appengine/docs/python/memcache/

+0

+1 memcached的建議,以減少對數據庫的命中 – 2009-04-29 09:06:08

1

我從來沒有嘗試構建一個谷歌的App Engine應用程序,但我知道這是有點類似Django的它在處理數據庫等

我不認爲你應該把東西存儲在全局變量中,而應該分別處理每個事務。獲取請求的作用是因爲你正在做你應該做的事情,並重新從數據庫請求信息。

如果你想在你的發佈功能中更新玩家,你可能想要傳遞詳細信息,[再次查看那些細節的玩家],請隨意修改它們。括號內的位是你錯過的步驟。

2

在您的文章的方法,就在「爲」條款,檢索存儲在何處的球員名單:

def post(self): 
    # some code skipped 

    self.shown_players = Player.all().fetch() 
    for i, player in enumerate(self.shown_players): 
     ... 
相關問題