我有一些遗留的 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)
显然,当存在列表时它会失败。
我应该如何继续这个用例,同时需要一个列表和一个对象?
您的列表是嵌入式文档列表吗?如果是这种情况,您可以使用 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})