在不初始化特定属性的情况下创建Google App Engine数据存储区实体

时间:2014-04-21 23:36:34

标签: python google-app-engine app-engine-ndb

我有一个Class实体,其属性为namestudents。我想首先创建实体,然后再向学生属性添加值。但是我我不知道该怎么做。我试过null(请原谅我,如果这是一个令人厌恶的,我是Python的新手)但它会返回一条错误信息。这是我的Class定义

class Class(ndb.Model):
     name = ndb.StringProperty(required=True)
     students = ndb.KeyProperty(repeated=True) 
     ...

我的班级模型的处理程序

class ClassHandler(webapp2.RequestHandler):
def post(self):
    name=self.request.get('class_name')
    callback = self.request.get('callback')
    class = class.get_by_id(name)
    if class:
        self.error(409)
    else:
        n = self.request.get('class_name')
        class=Class(id=n, class_name=n, members) #<<<---//this is where am stuck
        team.put()
        if callback:
            self.response.write(callback + '(' + team.toJSON() + ')')
        else:
            self.response.write(team.toJSON())

我花了几个小时在谷歌上寻找解决方案。对于我需要做什么的任何建议都将不胜感激。

编辑:这是我尝试使用null时收到的错误消息 enter image description here

2 个答案:

答案 0 :(得分:1)

  • 好的,首先class是python中受保护的单词,你应该命名你的变量class。执行此操作时,您将在本地覆盖单词class到Python的含义。此外,您似乎在做class.get_by_id(name)。你的意思是Class.get_by_id(name)?如果get_by_id(argument)Class类的方法,那将是正确的语法。

  • 其次,您应该发布您带有错误消息的跟踪,以便获得有关您的问题的帮助。

  • 我认为您可以在没有任何参数的情况下声明Class(),它将实现您的目标。它将创建没有指定任何参数的Class对象,您可以稍后指定它们。

实施例

class ClassHandler(webapp2.RequestHandler):
def post(self):
    name=self.request.get('class_name')
    callback = self.request.get('callback')
    the_class = Class.get_by_id(name)
    if not the_class:
        self.error(409)
    else:
        n = self.request.get('class_name')
        the_class = Class()
        team.put()
        if callback:
            self.response.write(callback + '(' + team.toJSON() + ')')
        else:
            self.response.write(team.toJSON())

我对你所做的改变:

  1. 我已将变量名称class更改为the_class
  2. 我已经更改了变量类的实例化,因此你有Class.get_by_id(name)这是调用该方法的正确语法,与ndb.Model相关联,由Class继承
  3. 我已将if语句更改为if not the_class。那是你想要的吗?否则,我对那里发生的事感到困惑。
  4. 在else语句中,你可以看到我刚刚宣布the_class = Class()我认为你问的是什么

答案 1 :(得分:1)

@akgill所说的一切都是+1。

至于您的具体问题,您无需在实体实例化时提供任何属性,也可以提供部分或全部属性。

当你谈论“null”或“无”时,我不确定你指的是什么。

任何添加学生的方法都需要在构造函数调用中提供学生列表,或者使用追加

cls = Class()
cls.students.extend([list of student keys])x