【问题标题】:How to create a Mongo Document Schema for a Recursive Object in Python?如何在 Python 中为递归对象创建 Mongo 文档模式?
【发布时间】:2020-03-11 15:27:54
【问题描述】:

自引用 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: name 'Category' is not defined

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

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

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

parent_category = mongoengine.ObjectIdField(Category, default=None)NameError: name 'Category' is not defined

问题本身

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

【问题讨论】:

    标签: python mongodb nosql pymongo mongoengine


    【解决方案1】:

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

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

    EmbeddedDocumentListField 使用EmbeddedDocument 进行初始化。

    EmbeddedDocument接受字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-27
      • 1970-01-01
      • 2014-11-26
      • 2021-09-17
      • 2013-07-19
      • 2021-10-04
      • 2021-10-30
      • 2018-07-15
      相关资源
      最近更新 更多