web-dev-qa-db-ja.com

TypeError:タイプのオブジェクトはJSONシリアライズ可能ではありません

Flaskを使用してrestflask-Marshmallowで書いています

models.py

class Application(db.Model):
    __tablename__ = 'applications'

    id = db.Column(db.String(), primary_key=True)
    name = db.Column(db.String())
    versions = db.relationship('Version', backref='application', lazy=True)

    def __repr__(self):
        return '<application {}>'.format(self.name)


class Version(db.Model):
    __tablename__ = 'versions'

    id = db.Column(db.String(), primary_key=True)
    file = db.Column(db.String(80), nullable=True)
    application_id = db.Column(db.Integer, db.ForeignKey('applications.id'))

shemas.py

class ApplicationDetailSchema(ma.Schema):
    class Meta:
        fields = ('id', 'name', 'versions')

routes.py

@bp.route("/<id>")
def application_detail(id):
    application = Application.query.get(id)
    result = application_detail_schema.dump(application)
    return jsonify(result)

TypeError:タイプ「バージョン」のオブジェクトはJSONシリアライズ可能ではありません

3
unknown

jsonify()を使用するには、jsonifyする必要のあるクラスをシリアライズ可能にする必要があります。そのクラスに次のような関数を追加します。

class Version(db.Model):
    __tablename__ = 'versions'

    id = db.Column(db.String(), primary_key=True)
    file = db.Column(db.String(80), nullable=True)
    application_id = db.Column(db.Integer, db.ForeignKey('applications.id'))

    def serialize(self):
        return {"id": self.id,
                "file": self.file,
                "application_id": self.application_id}

そして、objetc自体ではなく、オブジェクトのシリアル化されたバージョンをjsonifyします。

jsonify(result.serialize())
0
alexdefelipe