2012-09-01 51 views
1

我正在使用Python和GAE,我試圖創建一個字典,其中的鍵是userid和值是'Student'對象。但是,我的字典的值是None而不是學生對象。GAE和Python:我的字典值返回None而不是對象

{'60': , '59': } 

我真的很感激,如果有人可以指出我在正確的方向!

Student.py

class Student: 

def __init__(self, name, s_id, rew = {}): 
    self.name = name.strip() 
    self.rewards = {"Creativity": 0, "Helping Others":0, "Participation":0, "Insight":0} 
    self.totalRewardPoints = 0 
    self.s_id = s_id 

Main.py(我只包括了相關的代碼)

class PageHandler(webapp2.RequestHandler): 
def write(self, *a, **kw): 
    self.response.out.write(*a, **kw) 

def initialize(self, *a, **kw): 
    webapp2.RequestHandler.initialize(self, *a, **kw) 

def create_students(self): 
    user = db.GqlQuery("SELECT * FROM User WHERE position='student'") 

    for u in user: 

     temp_id = str(u.key().id()) 
     self.students[temp_id] = student.Student(u.name, temp_id) 

class MainPage(PageHandler): 

students = {} 

def get(self): 

    user = db.GqlQuery("SELECT * FROM User WHERE position='student'") 

    for u in user: 

     temp_id = str(u.key().id()) 
     self.students[temp_id] = student.Student(u.name, temp_id) 

    self.write(self.students) 

app = webapp2.WSGIApplication([('/', MainPage)], debug=True) 
+1

請重新格式化您的代碼,縮進是錯誤的。 –

+0

除了Tim已經確定的問題之外,您的代碼還有幾個主要的Python問題。不要像'__init__'中那樣使用字典字面值作爲默認函數參數 - 每次調用都會得到_same_字典,如果修改它,所有後續的調用當然會得到修改後的版本。同樣,您在MainPage類中'students'的定義是一個類級變量,而不是一個實例變量 - 而是在get()中定義它。 –

+0

另外,如果'Student'應該是一個模型類,那麼絕對不應該重寫'__init__'。很難正確使用工廠方法。 –

回答

2

對於初學者來說,你的學生類需要從一些模型類實現的AppEngine數據存儲持久性繼承。如果你使用的是原始數據存儲api,那麼使用db.Model,如果ndb則使用nbd.Model。

其次,你還沒有展示如何寫入(放入())學生實體到數據存儲區。根據你沒有從(db或ndb)繼承的事實,你不太可能將任何東西保存到數據存儲中。

除非你不包括你的實際代碼。如果您使用db.Model作爲基類,那麼您的獎勵字段不起作用。你應該看看ndb作爲替代的起點並使用結構化屬性。

你可能需要在AppEngine上存儲了視圖文檔的數據讀了https://developers.google.com/appengine/docs/python/datastore/overview#Python_Datastore_API你的代碼看起來一點也不像GAE(谷歌的AppEngine代碼)

您的學生班級應該是這個樣子(如果你想有一個獎勵領域有一些結構)

class Reward(ndb.Model): 
    reward = ndb.StringProperty() 
    value = ndb.IntegerProperty() 

class Student(ndb.Model): 
    name = ndb.StringProperty(required=True) 
    rewards = ndb.StructuredProperty(Reward, repeated=True) 
    total_reward_points = ndb.IntegerProperty() 
    s_id = ndb.StringProperty() 

否則,如果您使用db.Model那麼獎勵將是一個db.BlobProperty(),你會再泡菜是使用JSON保存數據時獎勵字典使用pickle.dumps或json.dumps編碼。

+0

我剛發現我的錯誤 - 我忘記了迭代字典通過...在...返回鍵而不是值。 我以爲我的錯誤是因爲我設立課程的方式,但這是一個更基本的課程。 –

+0

這是一個錯誤,但請參閱我寫的內容,您提供的代碼無法與appengine數據存儲和db.GqlQuery等一起使用。 –

相關問題