【问题标题】:Creating a Google App Engine datastore entity without initializing a particular property在不初始化特定属性的情况下创建 Google App Engine 数据存储区实体
【发布时间】:2014-04-21 23:36:33
【问题描述】:

我有一个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())

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

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

【问题讨论】:

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


    【解决方案1】:

    对@akgill 所说的一切都表示+1。

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

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

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

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

    【讨论】:

    • 我把这一切搞混了。你是对的,我不需要在实例化时为实体提供任何值。出现这种混淆是因为当我在没有初始化 members 属性的情况下创建实体时,该属性没有显示在数据存储区中的可用属性列表中我的 Class 实体,就是我初始化的那个。
    • 是的,数据存储将只存储初始化的属性(具有默认值或提供的值)
    • 在你的例子中,你的意思是extend还是append
    • 将列表添加到使用扩展的列表时,如果要向列表中添加单个项目,则使用追加。阅读有关列表方法的文档。
    【解决方案2】:
    • 好的,首先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(),我认为这就是您要询问的内容

    【讨论】:

    • 感谢您的提示。但是当我已经声明了members=ndb.KeyProperty(repeated=True) 时,我该如何使用None
    • 我现在已经查看了更多,并得出结论认为我关于使用 __init__ 的建议是错误的。我会修改我的帖子。但是,你还是要把你的trace和error放在你的帖子里,否则很难帮你找到你的错误。
    • 我已经编辑了问题以包含跟踪,我之前没有包含它,因为错误消息看起来很简单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 2010-12-03
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多