我目前在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相似,不同之处在于每个项目的“值”必须与指定的字段类型匹配,并且键必须为字符串类型。因此,在您的情况下,DocumentAModel documentB字段为MapField,值的类型为DocumentBModel。因此,对于DocumentBModel,您需要提供id和value字段。您正在使用石墨烯创建此模型,但对于普通(REST)DRF API和GraphQL API,模型映射将相同。 MapField有一些验证,例如key应该是String类型,而value应该是您在模型中提到的类型,但是在Dictfield的情况下,则不需要这种类型验证,它只是普通的[[Python Dictionary field。
检查代码段。然后根据需要更改Graphene
查询和架构。检查以下代码:class DocumentBModel(fields.EmbeddedDocument):
id = fields.StringField(required=True)
value = fields.IntField()
class DocumentAModel(Document):
name = fields.StringField(required=True)
documentB = fields.MapField(fields.EmbeddedDocumentField(DocumentBModel))
Django的外壳
$ python manage.py shell
>>>
>>> B_obj1 = DocumentBModel(**{'id': 'b_1', 'value': 1})
>>> B_obj2 = DocumentBModel(**{'id': 'b_2', 'value': 2})
>>> data_obj = DocumentAModel.objects.create(**{"name":"akash", "documentB":{"0":B_obj1, "1":B_obj2}})
>>> data_obj._data
{'id': ObjectId('5ebd1d2cf549becd5a462924'), 'name': 'akash', 'documentB': {'0': <DocumentBModel: DocumentBModel object>, '1': <DocumentBModel: DocumentBModel object
>}}
数据库条目:
{ "_id" : ObjectId("5ebd1d2cf549becd5a462924"), "name" : "akash", "documentB" : { "0" : { "id" : "b_1", "value" : 1 }, "1" : { "id" : "b_2", "value" : 2 } } }