GAE和Python:我的字典值返回None而不是object
我正在使用Python和GAE,我正在尝试创建一个字典,其中键是用户ID,值是“学生”对象。然而,我的字典的值是None,而不是student对象GAE和Python:我的字典值返回None而不是object,python,google-app-engine,Python,Google App Engine,我正在使用Python和GAE,我正在尝试创建一个字典,其中键是用户ID,值是“学生”对象。然而,我的字典的值是None,而不是student对象 {'60': , '59': } 如果有人能给我指出正确的方向,我将不胜感激 Student.py class Student: def __init__(self, name, s_id, rew = {}): self.name = name.strip() self.rewards = {"Creativity": 0, "
{'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(我只包含了相关代码)
首先,学生类需要从实现appengine数据存储持久性的某个模型类继承。如果您使用的是原始数据存储api,则为db.Model,如果为ndb,则为nbd.Model 其次,您还没有展示如何将(put())学生实体写入数据存储。基于您不是从(db或ndb)继承的事实,您不太可能将任何内容保存到数据存储中 当然,除非您没有包含实际代码。如果您使用db.Model作为基类,那么您的奖励字段将不起作用。您可能应该将ndb作为另一个起点,并使用结构化属性 您可能需要阅读appengine在视图文档上存储数据,您编写的代码与GAE(Google appengine代码)完全不同 你的学生班级应该看起来像(如果你想让奖励字段有某种结构)
否则,如果您使用db.Model,则奖励将是db.BlobProperty(),然后pickle将使用json在保存数据时使用pickle.dumps或json.dumps对奖励字典进行编码。请重新格式化您的代码,缩进是完全错误的。除了Tim已经确定的问题,您的代码中有几个主要的Python问题。永远不要像在
\uuuu init\uuuu
中那样使用字典文本作为默认函数参数-每个调用都将获得相同的字典,如果修改它,所有后续调用当然将获得修改后的版本。同样,您在主页类中对学生的定义是一个类级变量,而不是一个实例变量-请在get()
中定义它。此外,如果Student
应该是一个模型类,您绝对不应该重写\uuuuu init\uuu
。这很难做到正确-使用工厂方法代替。我刚刚发现了我的错误-我忘记了通过为…在。。。返回键而不是值。我认为我的错误是由于我设置类的方式造成的,但这是一个更基本的错误。这是一个错误,但看看我写的,您提供的代码永远无法与appengine数据存储和db.GqlQuery等一起使用。。。
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)
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()