2012-08-06 100 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