MongoDB - MongoEngine - 保存嵌入的文档不起作用 - 没有属性保存

Ron*_*Ron 3 database mongodb pymongo mongoengine

我有一个嵌入式文档类Post和一个父类Thread.

class Thread(Document):
    ...
    posts = ListField(EmbeddedDocumentField("Post"))

class Post(EmbeddedDocument): 
    attribute = StringField()
    ...
Run Code Online (Sandbox Code Playgroud)

我想创建一个新的职位,并把它添加到我ListFieldThread班.

我的代码看起来像这样:

post = Post()
post.attribute = "noodle"
post.save()
thread.posts.append(post)
thread.save()
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误消息:

"'发布'对象没有属性'保存'"

如果我跳过post.save()一个空Post对象附加到我的Thread.

有任何想法吗?

Fil*_*vić 6

嵌入式文档不是作为单独的,与文档实例分离的实例存在的,即保存嵌入的文档,您必须将文档本身保存在嵌入的文档中; 另一种看待它的方法是,如果没有实际文档,则无法存储嵌入式文档.

这也是因为,虽然您可以过滤包含特定嵌入文档的文档,但您不会收到匹配的嵌入文档本身 - 您将收到它所属的整个文档.

thread = Thread.objects.first()  # Get the thread
post = Post()
post.attribute = "noodle"
thread.posts.append(post)  # Append the post
thread.save()  # The post is now stored as a part of the thread
Run Code Online (Sandbox Code Playgroud)


Ros*_*oss 5

您的代码看起来不错 - 您确定没有其他线程对象吗?这是一个证明您的代码的测试用例(没有 post.save() 步骤)。你安装的是什么版本?

import unittest
from mongoengine import *


class Test(unittest.TestCase):

    def setUp(self):
        conn = connect(db='mongoenginetest')

    def test_something(self):

        class Thread(Document):
            posts = ListField(EmbeddedDocumentField("Post"))

        class Post(EmbeddedDocument):
            attribute = StringField()

        Thread.drop_collection()

        thread = Thread()
        post = Post()
        post.attribute = "Hello"

        thread.posts.append(post)
        thread.save()

        thread = Thread.objects.first()
        self.assertEqual(1, len(thread.posts))
        self.assertEqual("Hello", thread.posts[0].attribute)
Run Code Online (Sandbox Code Playgroud)