Python MongoEngine递归嵌入

Python MongoEngine递归嵌入,python,flask,mongoengine,flask-mongoengine,Python,Flask,Mongoengine,Flask Mongoengine,我试图用mongoengine为文档建模,但我不知道如何进行递归嵌入。例如,我想做这样的事情 class NavigationHelper(EmbeddedDocument): name = StringField() url = URLField() sub_menus = EmbeddedDocumentListField(NavigationHelper) 我将使用它创建一个导航树,它具有无限的子菜单可能性。比如说 -菜单-1 --子菜单-1-1 ---子菜单-1

我试图用mongoengine为文档建模,但我不知道如何进行递归嵌入。例如,我想做这样的事情

class NavigationHelper(EmbeddedDocument):
    name = StringField()
    url = URLField()
    sub_menus = EmbeddedDocumentListField(NavigationHelper)
我将使用它创建一个导航树,它具有无限的子菜单可能性。比如说

-菜单-1

--子菜单-1-1

---子菜单-1-1-1

---子菜单-1-1-2

----子菜单-1-1-2-1

-菜单-2


有没有什么方法可以为这个建模?非常感谢。

您可以使用一个高级
文档和一个
嵌入文档列表来建模

from mongoengine import Document, EmbeddedDocument, StringField, URLField, EmbeddedDocumentListField

# The embeddedDocument of sub-menus
class NavigationSubMenu(EmbeddedDocument):
    name = StringField()
    url = URLField()
    sub_menus = EmbeddedDocumentListField('NavigationSubMenu')


# The document for the main menus
class NavigationMenu(Document):
    name = StringField()
    url = URLField()
    sub_menus = EmbeddedDocumentListField(NavigationSubMenu)
您给出的示例将由以下人员创建:

docs = [
    NavigationMenu(name='1',
                   sub_menus=[
                       NavigationSubMenu(name='1-1',
                                         sub_menus=[
                                             NavigationSubMenu(name='1-1-1'),
                                             NavigationSubMenu(name='1-1-2',
                                                               sub_menus=[
                                                                   NavigationSubMenu(name='1-1-2-1')
                                                               ])
                                         ])
                   ]
                   ),
    NavigationMenu(name='2')
]

for doc in docs:
    doc.save()

docs = NavigationMenu.objects()

for doc in docs:
    print(doc.name)
    while len(doc.sub_menus) > 0:
        for sub_menu in doc.sub_menus:
            print(sub_menu.name)
            doc = sub_menu

>> 1
>> 1-1
>> 1-1-1
>> 1-1-2
>> 1-1-2-1
>> 2

如果保存此文件,将获得2个文档。每个高级
导航菜单一个

此菜单提供mongoengine.errors.InvalidDocumentError:创建
导航帮助程序
实例的无效数据。子菜单-类型对象“EmbeddedDocument”没有属性“\u class\u name”错误我在这里发布的代码有效。注意:在
类导航子菜单(EmbeddedDocument)
中,
子菜单=EmbeddedDocumentListField(EmbeddedDocument)
不引用自身,而是引用
EmbeddedDocument
。这有点危险,因为您可以将任何
嵌入文档
放在那里,不仅
导航子菜单
,而且可以确保您的一致性。请再次检查您的代码,并尝试按照我的步骤操作。没有,我在回答中使用了
NavigationHelper
,因此错误来自您的代码。与我们的代码唯一不同的是类的名称。如果我使用您的代码而不进行更改,我仍然会收到相同的错误。mongoengine.errors.InvalidDocumentError:用于创建
导航子菜单
实例的无效数据。子菜单-类型对象“EmbeddedDocument”没有属性“\u class\u name”您正在运行哪个python版本?顺便说一句,试试这个源代码()