Mongo嵌入式文档不是JSON可序列化的-Python

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

我目前在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?

谢谢

json python-3.x mongoengine graphene-python
1个回答
0
投票

MapFieldDictField相似,不同之处在于每个项目的“值”必须与指定的字段类型匹配,并且键必须为字符串类型。因此,在您的情况下,DocumentAModel documentB字段为MapField,值的类型为DocumentBModel。因此,对于DocumentBModel,您需要提供id和value字段。您正在使用石墨烯创建此模型,但对于普通(REST)DRF APIGraphQL 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 } } }

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