MongoDB — MongoEngine — сохранение встроенного документа не работает — нет сохранения атрибутов

У меня есть встроенный класс документа 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" не имеет атрибута "сохранить""

Если я пропущу post.save(), к моему Thread будет добавлен пустой объект Post.

Любые идеи?


person Ron    schedule 06.08.2012    source источник
comment
Речь не идет о программировании встроенных систем. Сменить тег. См. stackoverflow.com/tags/embedded/info.   -  person uɐɪ    schedule 06.08.2012


Ответы (2)


Ваш код выглядит нормально - вы уверены, что у вас нет других объектов потока? Вот тестовый пример, подтверждающий ваш код (без шага 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)
person Ross    schedule 06.08.2012
comment
Благодарность! на самом деле проблема заключалась в том, что deliciouspie потерял часть данных по пути... так что никаких проблем с монго нет :) - person Ron; 07.08.2012
comment
Разве это не должно быть EmbeddedDocumentField(Post) (без кавычек) вместо EmbeddedDocumentField(Post)? Из-за этого у меня было исключение. (Не знаю, возможно, это старый способ объявления встроенных документов) - person makaron; 14.04.2014

Встроенные документы не существуют как отдельные, отдельные экземпляры от их экземпляра документа, т. е. чтобы сохранить встроенный документ, вы должны сохранить сам документ там, где он встроен; другой способ взглянуть на это заключается в том, что вы не можете хранить встроенный документ без фактического документа.

Это также является причиной того, что, хотя вы можете фильтровать документы, содержащие определенный встроенный документ, вы не получите соответствующий встроенный документ как таковой — вы получите весь документ, частью которого он является.

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
person Filip Dupanović    schedule 06.08.2012
comment
Но ОП говорит, что если он испускает post.save(), пустой объект сообщения сохраняется. - person Amith George; 06.08.2012
comment
спасибо за сообщение, но у меня все еще есть проблема с пустым объектом сообщения - person Ron; 06.08.2012