Ron*_*Ron 3 database mongodb pymongo mongoengine
我有一个嵌入式文档类Post和一个父类Thread.
class Thread(Document):
...
posts = ListField(EmbeddedDocumentField("Post"))
class Post(EmbeddedDocument):
attribute = StringField()
...
Run Code Online (Sandbox Code Playgroud)
我想创建一个新的职位,并把它添加到我ListField的Thread班.
我的代码看起来像这样:
post = Post()
post.attribute = "noodle"
post.save()
thread.posts.append(post)
thread.save()
Run Code Online (Sandbox Code Playgroud)
但是我收到以下错误消息:
"'发布'对象没有属性'保存'"
如果我跳过post.save()一个空Post对象附加到我的Thread.
有任何想法吗?
嵌入式文档不是作为单独的,与文档实例分离的实例存在的,即保存嵌入的文档,您必须将文档本身保存在嵌入的文档中; 另一种看待它的方法是,如果没有实际文档,则无法存储嵌入式文档.
这也是因为,虽然您可以过滤包含特定嵌入文档的文档,但您不会收到匹配的嵌入文档本身 - 您将收到它所属的整个文档.
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
Run Code Online (Sandbox Code Playgroud)
您的代码看起来不错 - 您确定没有其他线程对象吗?这是一个证明您的代码的测试用例(没有 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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7285 次 |
| 最近记录: |