【发布时间】:2020-08-30 13:15:31
【问题描述】:
我目前正在将 Graphene 与 MongoEngine 一起使用。 mongo db架构如下
class DocumentAModel(Document):
id = StringField(required=True)
documentB = MapField(EmbeddedDocumentField(DocumentBModel)
class DocumentBModel(EmbeddedDocument):
id = StringField(required=True)
value = IntField()
一个示例文档A如下
{
id: "id_1",
documentB: {
0: {
id: "b_1",
value: 1
},
1: {
id: "b_2",
value: 11
}
}
相应地,它们的石墨烯类型是
class DocumentB(MongoengineObjectType):
class Meta:
model = DocumentBModel
class DocumentA(MongoengineObjectType):
class Meta:
model = DocumentAModel
最后,查询如下所示
class Query(graphene.ObjectType):
all_document_a = graphene.List(DocumentA)
def resolve_all_document_a(self, info):
return list(DocumentAModel.objects.all())
但是,当我查询 allDocumentA 以获取文档 B 时,我得到了错误
DocumentBModel 类型的对象不是 JSON 可序列化的
我不确定将文档 B 编组到 json 的位置。
如果我将 DocumentB 从 MapField(EmbeddedDocumentField(DocumentBModel) 更改为 DictField(),它可以正常工作。但是有没有办法使用 MapField?
谢谢
【问题讨论】:
-
MapField 与 DictField 类似,只是每一项的“值”必须与指定的字段类型匹配。
-
是的,我想强制该值为 DocumentB 类型
-
有同样的问题。有进展吗?
-
是的,我认为问题在于 graphql 要求响应对象具有明确的结构。将字典或地图作为属性“混淆”graphql。在上面的示例中,查询可能是 query { documentA { id documentB { 0 { id value } 1 { id value } } } } 但 documentB 没有任何属性 0 和 1。所以它只需要是一个字典列表。希望有帮助
标签: json python-3.x mongoengine graphene-python