Python MongoEngine递归嵌入
我试图用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
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版本?顺便说一句,试试这个源代码()