文档中的字段可能是列表和对象

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

我有一些遗留的 MongoDB 集合,其中有一个可以为 null 的特定字段、一个列表 (

[]
) 和一个具有特定字段列表的对象。我正在尝试实现允许这种行为的基本文档。

我尝试使用这种方法:

class MyDBEntity(Document):
  my_field = GenericEmbeddedDocumentField(
        choices=(
            MyParticularField,
            List
        ),
        default=None,
        null=True
    )
class MyParticularField(EmbeddedDocument):
  # some fields, etc.

每次我尝试使用这种方法时,都会收到此错误:

File "path_to_venv/mongoengine/fields.py", line 837, in to_python
 doc_cls = get_document(value["_cls"])
KeyError: '_cls'

我的理解是 MongoEngine 应该为我填充

_cls
字段,但是,它不在那里。

如果我使用独立的

EmbeddedDocumentField
,当预期对象位于集合中的条目中时,该解决方案将起作用:

class MyDBEntity(Document):
  my_field = EmbeddedDocumentField(MyParticularField, default=None, null=True)

显然,当存在列表时它会失败。


我应该如何继续这个用例,同时需要一个列表和一个对象?

python mongoengine
1个回答
0
投票

您的列表是嵌入式文档列表吗?如果是这种情况,您可以使用 EmbeddedDocumentListField。如果没有,您可以只使用 DynamicField,这将接受您想要的任何值。如果您想限制接受的值类型,可以在保存文档之前使用“clean”功能检查数据:

class MyDBEntity(Document):
    my_field = DynamicField(null=True)
    def clean(self):
        #Check that the type is correct, if not, raise a ValidationError('Error')
        ....

关于 _cls,如果我没记错的话,这个字段仅在您使用文档继承时才存在(meta = {'allow_inheritance': True})

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