如何使用Marshmallow序列化MongoDB的ObjectId?

2024-10-01 07:50:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用棉花糖和芒果汁在烧瓶上做原料药。当我打电话并且一个ID应该被序列化时,我收到以下错误:

TypeError: ObjectId('54c117322053049ba3ef31f3') is not JSON serializable

我在其他库中看到了一些方法来覆盖ObjectId的处理方式。我还没想好用棉花糖,有人知道怎么做吗?在

我的模型是:

^{pr2}$

我的序列化程序:

class ProcessSerializer(Serializer):
    class Meta:
        fields = ("id", "created_at", "name")

以及观点:

class ProcessView(Resource):
    def get(self, id):
        process = Process.objects.get_or_404(id)
        return ProcessSerializer(process).data

Tags: idget序列化烧瓶is错误process原料药
2条回答

marshmallow-mongoengine执行以下操作:

Marshmallow-Mongoengine is about bringing together a Mongoengine Document with a MarshmallowSchema.

import marshmallow_mongoengine as ma


class ProcessSchema(ma.ModelSchema):
    class Meta:
        model = Process

它有一个^{}字段,用于序列化/反序列化ObjectIds

当您将Meta.fields传递给模式时,Marshmallow会尝试为每个属性选择一个字段类型。因为它不知道ObjectId是什么,所以它只将它传递给序列化的dict。当您尝试将其转储到JSON时,它不知道ObjectId是什么,并引发错误。要解决这个问题,您需要告诉marshullow要使用哪个字段作为id。A BSON ^{}可以转换为字符串,所以使用String字段。在

from marshmallow import Schema, fields

class ProcessSchema(Schema):
    id = fields.String()

    class Meta:
        additional =  ('created_at', 'name')

您还可以告诉Marshmallow要为ObjectId类型使用哪个字段,这样就不必每次都添加字段。在

^{pr2}$

相关问题 更多 >