我可以在 MongoEngine 中保存和加载异构的多态类型列表吗?
Can I save and load a heterogenous list of polymorphic types in 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时,它的特定多态类型丢失了,所以没有足够的数据来重建我原来的subclass:
[{"an_int":3}, {"a_string":"bar"}]
不同于保存顶级文档时,文档的特定 class 名称是数据库中集合的名称。
我可以使 BaseEmbedded
成为 DynamicEmbeddedDocument
,为每个子类型添加一个具有适当值的 'type' StringField
,并根据类型字段重建列表元素对象.
有没有我没有想到的更好的解决方案?
将 JSON 映射到 类 是 Mongoengine 所做的,并且也支持嵌入式文档。
您需要在嵌入文档的元中设置 allow_inheritance=True。
我想在 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时,它的特定多态类型丢失了,所以没有足够的数据来重建我原来的subclass:
[{"an_int":3}, {"a_string":"bar"}]
不同于保存顶级文档时,文档的特定 class 名称是数据库中集合的名称。
我可以使 BaseEmbedded
成为 DynamicEmbeddedDocument
,为每个子类型添加一个具有适当值的 'type' StringField
,并根据类型字段重建列表元素对象.
有没有我没有想到的更好的解决方案?
将 JSON 映射到 类 是 Mongoengine 所做的,并且也支持嵌入式文档。 您需要在嵌入文档的元中设置 allow_inheritance=True。