首页 > 解决方案 > SQLAlchemy & SQLAlchemySchema GET 返回 jsonified 数据为空字典

问题描述

这是我的模型:

class Todo(db.Model):
    __tablename__ = "todos"
    id = db.Column(db.Integer, primary_key=True)
    description = db.Column(db.String(), nullable=False)


class TodoSchema(ma.SQLAlchemySchema):
    class Meta:
        model = Todo

这是我的路线

@app.route("/data", methods=["GET"])
def data():
    data = Todo.query.all()
    print(len(data)) #28
    print(data) #[<Todo 1>, <Todo 2>, <Todo 3>, <Todo 4>, <Todo 5>, <Todo 6>, <Todo 7>, <Todo 8>, <Todo 9>, <Todo 10>, <Todo 11>, <Todo 12>, <Todo 13>, <Todo 14>, <Todo 15>, <Todo 16>, <Todo 17>, <Todo 18>, <Todo 19>, <Todo 20>, <Todo 21>, <Todo 22>, <Todo 23>, <Todo 24>, <Todo 25>, <Todo 26>, <Todo 27>, <Todo 28>]
    todo_schema = TodoSchema()
    output = todo_schema.dump(data)
    print(output) # {}
    return output

当我做一个循环时,它看起来像这样:

for item in data:
   print(item.description)

walk the dog
buy groceries
....

您可以print在评论中看到它背后的语句的输出。所以我想要的是从我可以返回的数据对象中创建一个 JSON 对象。输出结果为空字典的原因是什么?有没有像这样的简单解决方案

data = Todo.query.all()
return jsonify({data})

标签: pythonsqlalchemyflask-sqlalchemyflask-marshmallow

解决方案


你的代码有一个问题。您正在从数据库中获取所有待办事项

Todo.query.all()

但是当你实例化你的模式时,你没有指定很多参数。将您的 Schema 实例化更改为

todo_schema = TodoSchema(many=True)

引用文档

many – 如果 obj 是一个集合,则应设置为True,以便将对象序列化为列表。

供您参考,请访问https://marshmallow.readthedocs.io/en/latest/api_reference.html#marshmallow.Schema并前往marshmallow.Schema类的参数

更新

正如评论中提到的,还有另一个问题,它现在返回一个空字典列表。为此,这是一个参考链接 https://marshmallow-sqlalchemy.readthedocs.io/en/latest/api_reference.html

尝试使用ModelSchema而不是SQLAlchemySchema


推荐阅读