10

マシュマロとモンゴエンジンを使用して、Flask の上に API を構築しています。呼び出しを行い、ID をシリアル化する必要がある場合、次のエラーが表示されます。

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

ObjectId の処理方法をオーバーライドするために、他のライブラリでいくつかの方法を見ました。私はまだマシュマロでそれを理解していません.誰もそれを行う方法を知っていますか?

私のモデルは次のとおりです。

class Process(db.Document):
    name = db.StringField(max_length=255, required=True, unique=True)
    created_at = db.DateTimeField(default=datetime.datetime.now, required=True)

私のシリアライザ:

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
4

4 に答える 4

17

スキーマに渡すだけMeta.fieldsで、Marshmallow は各属性のフィールド タイプを選択しようとします。an が何であるかがわからないObjectIdため、シリアル化された dict に渡すだけです。これを JSON にダンプしようとすると、 an が何であるかがわからずObjectId、エラーが発生します。これを解決するには、ID に使用するフィールドを Marshmallow に伝える必要があります。BSONObjectIdは文字列に変換できるため、Stringフィールドを使用します。

from marshmallow import Schema, fields

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

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

ObjectId毎回フィールドを追加する必要がないように、型に使用するフィールドを Marshmallow に指示することもできます。

from bson import ObjectId
from marshmallow import Schema, fields

Schema.TYPE_MAPPING[ObjectId] = fields.String
于 2015-01-22T17:06:37.250 に答える
2

marshmallow-mongoengineはこれを行います:

Marshmallow-MongoengineMongoengineDocument と を組み合わせることが重要Marshmallow Schemaです。

import marshmallow_mongoengine as ma


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

ObjectIdsをシリアライズ/デシリアライズするフィールドがありますObjectId

于 2016-06-13T08:18:07.617 に答える