如何在Python中为递归对象创建Mongo文档架构?

问题描述 投票:0回答:1

自引用Python对象MongoDB架构

我想达到什么目的?

我正在尝试创建的程序将处理描述杂货产品类别的数据,例如:牛奶,牛肉,玉米,当地水果等。我计划将此数据存储在MongoDB实例中,因此创建schema会很好。

我的问题的原因是类别具有子类别(乳制品:牛奶,奶酪,酸奶;肉类:牛肉,猪肉等),导致递归对象

单独的Python

我查看了StackOverflow,如何在Python中处理这种结构。

class Category():
    def _init_(self, name, amount, subcategories = ()):
        self.name = name
        self.amount = amount
        for subcategory in subcategories:
            assert isinstance(subcategory, Category)
        self.subcategories = subcategories

这似乎是对的...

模式部分

...但是直到我尝试将其绑定到架构中:

class Category(mongoengine.EmbeddedDocument):
    def _init_(self, name, amount, subcategories = ()):
        self.name = name
        self.amount = amount
        for subcategory in subcategories:
            assert isinstance(subcategory, Category)
        self.subcategories = subcategories


    name = mongoengine.StringField(required=True)
    amount = mongoengine.FloatField(required=True)
    subcategories = mongoengine.EmbeddedDocumentListField(Category, default=None)
    meta = {
        'db_alias': 'core',
        'collection': 'category',
        'indexes': [
            'name',
            'amount',
            'subcategories',
        ],
        'ordering': ['-name']
    }

运行此代码会导致错误:

subbcategories = mongoengine.EmbeddedDocumentListField(Category,default = None)NameError:未定义名称'Category']

我尝试引用父类别,而不是嵌入子类别:

parent_category = mongoengine.ObjectIdField(Category, default=None)

但是我仍然得到完全相同的错误消息:

parent_category = mongoengine.ObjectIdField(Category,default = None)NameError:未定义名称'Category']

问题本身

我应该如何为这样的递归对象定义架构?有可能吗?

python mongodb nosql pymongo mongoengine
1个回答
0
投票

您可以尝试在此行中使用str 'Category'而不是类型Category

subcategories = mongoengine.EmbeddedDocumentListField('Category', default=None)

[EmbeddedDocumentListField使用EmbeddedDocument进行初始化。

[EmbeddedDocument accept str。

© www.soinside.com 2019 - 2024. All rights reserved.