1

私はPythonとGAEを使用しており、キーがユーザーIDで、値が「学生」オブジェクトである辞書を作成しようとしています。ただし、私の辞書の値は、学生オブジェクトではなく、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)
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()になり、pickleはjsonを使用して、データを保存するときにpickle.dumpsまたはjson.dumpsを使用して報酬ディクショナリをエンコードします。

于 2012-09-01T10:47:51.230 に答える