2012-08-06 76 views
2

我有一个嵌入式的文档类Post和父亲级Thread的MongoDB - MongoEngine - 保存嵌入文档不工作 - 有没有属性保存

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

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

我想创建一个新的职位,并在Thread类添加到我的ListField

我的代码如下所示:

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

,但我得到了以下错误消息:

“ '邮报' 对象有没有属性 '保存'”

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

任何想法?

+2

这不是关于嵌入式系统编程。重新标记。参见http://stackoverflow.com/tags/embedded/info – 2012-08-06 15:08:40

回答

3

你的代码看起来很好 - 你确定你没有其他的线程对象吗?下面是一个证明你的代码的测试用例(没有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) 
+0

谢谢!实际上,问题是tastypie“丢失”的一些数据上的方式......所以没有蒙戈 - 问题都:) – Ron 2012-08-07 08:58:11

+1

难道不应该是* EmbeddedDocumentField(POST)*(不带引号),而不是* EmbeddedDocumentField(”邮报“)*?因为这个,我有个例外。 (不知道,也许这是宣布嵌入式文档的旧方法) – makaron 2014-04-14 16:53:45

4

嵌入式文件不从他们的文档实例存在的个体,不同的情况下,即救你必须保存在那里的嵌入到文档本身嵌入文档;另一种看待它的方式是,不能在没有实际文档的情况下存储嵌入式文档。

这也是,而你可以过滤包含特定嵌入的文档文件,您将不会收到匹配的嵌入文档本身的原因 - you'll接收到完整的文档是的一部分。

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 
+1

但是OP在说如果他发出'post.save()'保存一个空的post对象。 – 2012-08-06 09:32:22

+0

谢谢你的帖子,但我仍然有空帖子对象的问题 – Ron 2012-08-06 10:10:01

+1

已经为你创建了一个测试用例,显示它正在工作... – Ross 2012-08-06 10:15:02