web-dev-qa-db-fra.com

TypeError: l'objet de type n'est pas sérialisable JSON

Je suis écrit rest sur le Flask utilisant flask-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: l'objet de type 'Version' n'est pas sérialisable JSON

3
unknown

Pour utiliser jsonify(), vous devez rendre sérialisable la classe dont vous avez besoin pour jsonify. Ajoutez à cette classe une fonction similaire à la suivante:

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}

Et puis jsonifier la version sérialisée de l'objet, et non l'objet lui-même:

jsonify(result.serialize())
0
alexdefelipe