GAE和Python:我的字典值返回None而不是对象

时间:2012-09-01 10:37:35

标签: python google-app-engine

我正在使用Python和GAE,我正在尝试创建一个字典,其中键是userid,值是'Student'对象。但是,我的字典值是None而不是student对象。

{'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 :(得分:2)

对于初学者,Student类需要从实现appengine数据存储持久性的某个模型类继承。如果您使用的是原始数据存储api,则使用db.Model,如果是ndb则使用nbd.Model。

其次,您没有展示如何将(put())学生实体写入数据存储区。根据您不是从(db或ndb)继承的事实,您不太可能将任何内容保存到数据存储区。

除非您不包含实际代码。如果您使用db.Model作为基类,那么您的奖励字段将不起作用。您应该将ndb视为备用起点并使用结构化属性。

您可能需要通过查看文档https://developers.google.com/appengine/docs/python/datastore/overview#Python_Datastore_API阅读存储数据的appengine,您的代码看起来与GAE(Google 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使用json编码奖励字典。