【问题标题】:MongoDB - MongoEngine - Saving an embedded document doesn't work - Has no attribute saveMongoDB - MongoEngine - 保存嵌入文档不起作用 - 没有属性保存
【发布时间】:2012-08-03 05:54:24
【问题描述】:

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

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

class Post(EmbeddedDocument): 
    attribute = StringField()
    ...

我想创建一个新帖子并将其添加到我的ListField Thread 类中。

我的代码如下所示:

post = Post()
post.attribute = "noodle"
post.save()
thread.posts.append(post)
thread.save()

但我收到以下错误消息:

"'Post' 对象没有属性 'save'"

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

有什么想法吗?

【问题讨论】:

标签: mongodb pymongo mongoengine database


【解决方案1】:

您的代码看起来不错 - 您确定没有其他线程对象吗?这是一个证明您的代码的测试用例(没有 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)

【讨论】:

  • 谢谢!实际上问题是,美味的派在途中“丢失”了一些数据......所以根本没有mongo问题:)
  • 不应该是EmbeddedDocumentField(Post)(不带引号)而不是EmbeddedDocumentField("Post")吗?因此,我有一个例外。 (不知道,可能是声明嵌入文档的老办法)
【解决方案2】:

嵌入文档不作为单独的、独立的实例与其文档实例存在,即,要保存嵌入文档,您必须将文档本身保存在嵌入的位置;另一种看待它的方式是,如果没有实际文档,您就无法存储嵌入式文档。

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

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

【讨论】:

  • 但是 OP 说如果他发出 post.save() 一个空的帖子对象被保存。
  • 感谢您的帖子,但我仍然遇到空帖子对象的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-30
  • 2014-11-09
  • 2019-05-28
  • 2016-10-09
  • 1970-01-01
  • 2020-01-28
  • 2014-03-11
相关资源
最近更新 更多