Ошибка типа: объект типа не поддерживает сериализацию в формате JSON - PullRequest
2 голосов
/ 11 октября 2019

Я написал rest на колбу, используя 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')

rout.py

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

Ошибка типа: объект типа «Версия» не поддерживает сериализацию в формате JSON

Ответы [ 3 ]

1 голос
/ 11 октября 2019

Вы, вероятно, хотите, чтобы вы использовали ModelSchema вместо Schema.

class ApplicationDetailSchema(ma.ModelSchema):
    class Meta:
        model = Application
        fields = ('id', 'name', 'versions')

ModelSchema по умолчанию сбрасывает связанные объекты внешнего ключа в виде списка идентификаторов, который сериализуем в JSON.

0 голосов
/ 11 октября 2019

Чтобы использовать 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}

И затем jsonify де сериализованной версии объекта, а не сам объект:

jsonify(result.serialize())
0 голосов
/ 11 октября 2019

Попробуйте использовать json.dumps () и json.loads ()

https://docs.python.org/3/library/json.html

...