2012-09-01 4 views
1

저는 파이썬과 GAE를 사용하고 있으며 키가 userid이고 값이 'Student'객체 인 사전을 만들려고합니다. 그러나 내 사전의 값은 학생 개체가 아니라 없음입니다.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는 학생 클래스 일부 모델 클래스 구현에서 appengine 데이터 저장소의 지속성에서 상속 할 필요가 우선 들어

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

(난 단지 관련 코드를 포함 시켰습니다) . 원래 데이터 저장소 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 후 보상 (A db.BlobProperty 것) 당신이하고자 사용하는 경우는 피클이 사용 JSON 데이터를 저장할 때 보상 pickle.dumps 또는 json.dumps를 사용하여 사전 인코딩하는 것입니다 .

+0

방금 ​​실수를 발견했습니다. 다음을 위해 사전을 반복하는 것을 잊어 버렸습니다 ... ... 키가 값이 아닌 값을 반환합니다. 나는 내 실수를 내 수업을 설정하는 방식으로 생각했지만 훨씬 기본적인 것이 었습니다. –

+0

그건 실수 하나, 필자가 작성한 코드는 appengine 데이터 스토어와 db.GqlQuery 등에서 결코 작동하지 않을 것입니다. –

관련 문제