3

埋め込みドキュメント クラス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オブジェクトが my に追加されますThread

何か案は?

4

2 に答える 2

7

埋め込みドキュメントは、ドキュメント インスタンスとは別の個別のインスタンスとして存在しません。つまり、埋め込みドキュメントを保存するには、ドキュメント自体を埋め込まれた場所に保存する必要があります。別の見方をすると、実際のドキュメントがなければ埋め込みドキュメントを保存できないということです。

これは、特定の埋め込みドキュメントを含むドキュメントをフィルター処理することはできますが、一致する埋め込みドキュメント自体を受信するのではなく、その一部であるドキュメント全体を受信する理由でもあります。

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
于 2012-08-06T09:23:23.420 に答える
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)
于 2012-08-06T10:14:23.173 に答える