首页 > 解决方案 > 从 Flask Sqlalchemy 查询返回 JSON 列表

问题描述

我正在尝试制作一个 API,我可以向(从前端应用程序)发送请求并显示该信息。

我已经建立了一个 Postgres 数据库,并且正在使用 Flask 和 Sqlalchemy。

我的第一个函数,它返回数据库中的单个条目确实有效:

@app.route("/get/<id_a>/<id_b>")
def get_by_id(id_a,id_b):
    try:
        ref=PlanApp.query.filter_by(plan_ref=f"{id_a}/{id_b}").first()
        return jsonify(ref.serialize())
    except Exception as e:
        return(str(e)) 

其中 PlanApp 是一个模型类。

但是,我没有成功返回行列表。例如,我想获取某个列(日期)在给定日期之后的所有行。

@app.route("/get/<date>")
def get_since_date(date):
    try:
        result=PlanApp.query.filter(PlanApp.app_date>date).all()
        return jsonify(result.serialize())
    except Exception as e:
        return(str(e))

这将返回:

“列表”对象没有“序列化”属性

所以我删除了序列化功能。然后我遇到了:

PlanApp 类型的对象不是 JSON 可序列化的

我在这里错过了什么吗?提前谢谢了。我将在下面包含完整的代码。

from flask import Flask, abort, jsonify, make_response, request
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from flask_cors import CORS, cross_origin
from models import db, PlanApp
import os
 
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = os.environ['DATABASE_URL']
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SQLALCHEMY_ECHO'] = True

db.init_app(app)
migrate = Migrate(app, db)
 

# @app.route('/')
# def show_all():
#    return render_template('show_all.html', PlanApp = PlanApp.query.all() )

# Get a planning application by its reference number
# Two arguments because the format of a ref is 'xxxx/xx'
@app.route("/get/<id_a>/<id_b>")
def get_by_id(id_a,id_b):
    try:
        print(f"{id_a}/{id_b}")
        ref=PlanApp.query.filter_by(plan_ref=f"{id_a}/{id_b}").first()
        print(ref)
        return jsonify(ref.serialize())
    except Exception as e:
        return(str(e))

@app.route("/get/<date>")
def get_since_date(date):
    try:
        print(date)
        result=PlanApp.query.filter(PlanApp.app_date>date).all()
        print(result)
        # result = [r for r, in result]
        # for r in result:
        #     print(type(r))
        # result = PlanApp.query.filter_by(app_date>date)
        return jsonify(result.serialize())
    except Exception as e:
        return(str(e))

if __name__ == '__main__':
    app.run(debug=True)

标签: pythonpostgresqlflaskflask-sqlalchemy

解决方案


推荐阅读