2012-09-01 1 views
1

Я использую Python и GAE, и я пытаюсь создать словарь с ключами, являющимися идентификатором пользователя, а значения - объектом «Студент». Однако значения моего словаря - это «Нет», а не объект-ученик.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

Помимо проблем, которые уже определил Тим, в вашем коде есть несколько серьезных проблем с Python. Никогда не используйте литерал словаря как параметр функции по умолчанию, как в '__init__' - каждый вызов будет получать словарь _same_, и если вы его измените, все последующие вызовы, конечно же, получат модифицированную версию. Аналогично, ваше определение «учеников» в классе «MainPage» представляет собой переменную уровня класса, а не переменную экземпляра. Вместо этого определите ее внутри 'get()'. –

+0

Кроме того, если 'Student' должен быть модельным классом, вы определенно не должны переопределять' __init__'. Трудно сделать правильно - вместо этого используйте заводский метод. –

ответ

2

Для начала вы студент класс должен наследовать от некоторого класса модели, реализующей AppEngine датастора настойчивость , Если вы используете исходный datastore api, тогда db.Model, если ndb, то nbd.Model.

Во-вторых, вы не показали, как вы записываете (put()) сущности студента в хранилище данных. Исходя из того факта, что вы не наследуете ни (db, ни ndb), маловероятно, что вы сохраняете что-либо в хранилище данных.

Если вы не указали свой код. Если вы используете db.Model в качестве базового класса, то ваше вознаграждение не будет работать. Вероятно, вы должны посмотреть на ndb как альтернативную отправную точку и использовать структурированное свойство.

Вы, вероятно, нужно прочитать на AppEngine, хранящие данные по просмотру дока https://developers.google.com/appengine/docs/python/datastore/overview#Python_Datastore_API вы код не выглядит как 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 при сохранении данных ,

+0

Я только что нашел свою ошибку - я забыл итерацию словаря через for ... in ... возвращает ключи, а не значения. Я предположил, что моя ошибка была связана с тем, как я настраивал свои занятия, но это было гораздо более основательно. –

+0

Это одна ошибка, но посмотрите, что я написал, код, который вы предоставили, никогда не сможет работать с хранилищем данных appengine и db.GqlQuery и т. Д. –

Смежные вопросы