在NDB中将StructuredProperty添加到模型中

时间:2013-01-30 19:15:18

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

(无法想到一个更好的头衔:S)

所以我最近从db更改为ndb,我无法获得一部分工作。我有这个教程模型有章节,所以我使用  ndb.StructuredProperty'将模型章节与教程相关联。 我可以毫无问题地创建教程和章节,但我不能将这些章节指向教程。

教程模型:

class Tutorial(ndb.Model):
    title = ndb.StringProperty(required=True)
    presentation = ndb.TextProperty(required=True)
    extra1 = ndb.TextProperty()
    extra2 = ndb.TextProperty()
    extra3 = ndb.TextProperty()
    tags = ndb.StringProperty(repeated=True)
    votes = ndb.IntegerProperty()
    created = ndb.DateTimeProperty(auto_now_add=True)
    last_modified = ndb.DateTimeProperty(auto_now=True)
    chapters = ndb.StructuredProperty(Chapter, repeated=True)

编辑类:

class EditTut(FuHandler):
    def get(self):
        ...
        ...

    def post(self):
        editMode = self.request.get('edit')

        if editMode == '2':
            ...
            ...

        elif editMode == '1':
            tutID = self.request.cookies.get('tut_id', '')
            tutorial = ndb.Key('Tutorial', tutID)
            title = self.request.get("chapTitle")
            content = self.request.get("content")
            note = self.request.get("note")

            chap = Chapter(title=title, content=content, note=note)
            chap.put()
            tutorialInstance = tutorial.get()
            tutorialInstance.chapters = chap
            tutorialInstance.put()

            self.redirect('/editTut?edit=%s' % '0')
        else:
            self.redirect('/editTut?edit=%s' % '1')

使用此代码创建教程但我收到此错误:

tutorialInstance.chapters = chap
AttributeError: 'NoneType' object has no attribute 'chapters'

3 个答案:

答案 0 :(得分:2)

你好像很困惑。使用StructuredProperty时,包含的对象没有自己的ID或密钥 - 它只是外部对象中有趣名称的更多属性。也许您希望重复KeyProperty 本书与其章节相关联,而不是将所有章节都包含在里面本书中?你必须选择其中一个。

答案 1 :(得分:1)

更新:在@nizz的帮助下, 改变

tutorialInstance = tutorial.get()
tutorialInstance.chapters = chap

为:

tutorialInstance = ndb.Key('Tutorial', int(tutID)).get()
tutorialInstance.chapters.append(chap)

工作得很好。

答案 2 :(得分:1)

您正在处理列表...您需要将对象附加到列表

tutorialInstance.chapters.append(chap)