1

我正在使用 Python 和 GAE,我正在尝试创建一个字典,其中键是用户 ID,值是“学生”对象。但是,我的字典的值是 None 而不是学生对象。

{'60': , '59': }

如果有人能指出我正确的方向,我将不胜感激!

学生.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)
4

1 回答 1

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 在保存数据时。

于 2012-09-01T10:47:51.230 回答