我可以在MongoEngine中保存和加载异构类型的异构列表吗?

时间:2015-05-13 10:21:37

标签: python mongodb mongoengine

我想在MongoEngine中保存并加载一个异构的多态类型列表。 理想情况下我想要的是:

from mongoengine import Document, EmbeddedDocument, IntField, StringField
class BaseEmbedded(EmbeddedDocument):
    meta = {'abstract': True}
class FooEmbedded(BaseEmbedded):
    an_int = IntField()
class BarEmbedded(BaseEmbedded):
    a_string = StringField()
class HasList(Document):
    heterogeneous_list = ListField(EmbeddedDocumentField(BaseEmbedded))
has_list = HasList()
has_list.heterogeneous_list = [FooEmbedded(an_int=3), BarEmbedded(a_string='bar')]
has_list.save()
HasList.objects(id=has_list.id)

问题是,在保存EmbeddedDocument时,其特定的多态类型会丢失,因此没有足够的数据来重建我的原始子类:

[{"an_int":3}, {"a_string":"bar"}]

与保存顶级文档时不同,其中Document的特定类的名称是数据库中集合的名称。

我可以BaseEmbedded成为DynamicEmbeddedDocument,添加'类型' StringField为每个子类型指定适当的值,并根据类型字段重建列表元素对象。

我没有想到更好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

将JSON映射到类是Mongoengine的功能,也支持嵌入式文档。 您需要在嵌入式文档的元数据中设置allow_inheritance = True。