mongoengine查询到嵌套listfield

时间:2018-12-04 09:15:46

标签: mongodb mongoengine

我用python flask开发了商品系统。

要与mongodb通信,请使用flask_mongoengine

这是我的模特。

class SubComment(EmbeddedDocument):
    no = SequenceField()
    body = StringField()

class Comment(EmbeddedDocument):
    no = SequenceField()
    body = StringField()
    sub_comment = ListField(EmbeddedDocumentField(SubComment))


class Article(Document):
    title = StringField()
    body = StringField()
    comments = ListField(EmbeddedDocumentField(Comment))

SubComment模型存储在Comment模型中,而Comment模型存储在Article模型中。

所以,这是我想要的输出。

{
    "_id" : ObjectId("5c0641d81b48d9fe50dfdd7f"),
    "title" : "test",
    "body" : "gogo",
    "comments" : [
        {
            "no" : 1,
            "body" : "first comment",
            "sub_comment" : [
                   {
                        "no": 1,
                        "body": "sub comm"
                   }
            ]
        }
    ]
}

当我将Comment模型插入Article模型时,只需使用以下代码即可。

comment = Comment(
    body='first comment'
)
article = Article.objects(body='gogo').first()
article.comments.append(comment)
article.save()

但是当我尝试将SubComment插入Comment时,它会引发错误-> AttributeError: 'BaseList' object has no attribute 'sub_comment'

下面是我使用的代码。

comment = SubComment(
    body='sub comment'
)
article = Article.objects(title='test', comments__no=1).first()
article.comments.sub_comment.append(comment)
article.save()

经过搜索后,人们说无法插入嵌套字段。

这里有什么解决办法吗?我必须使用原始查询吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

[已解决]

我用for这样的循环解决了。

count = 0
article = Article.objects(title='test', comments__no=1).first()
for comment in article.comments:
    if comment.no == 1:
        print(comment.no)
        count = comment.no - 1

article.comments[count].sub_comment.append(sub_comment)
article.save()

但是我不知道这是正确的方法。

如果您有其他解决方案,请对其进行评论。