如何解决如何使用flask和jsonify在json响应中添加嵌套的数组和对象
我目前正在遵循此example来启动并运行API(下面的代码)
@JsonIgnore
@JsonProperty(value = "user_password")
public String getUserPassword() {
return userPassword;
}
最后,我想得到一个嵌套数组from flask import Flask,request,jsonify
from flask_restful import Resource,Api
from sqlalchemy import create_engine
from json import dumps
import mysql.connector
db_connect = create_engine('mysql+pymysql://root:pass@localhost/news')
app = Flask(__name__)
api = Api(app)
class Events(Resource):
def get(self):
conn = db_connect.connect() # connect to database
query = conn.execute("select id,title,description,date,scheduled,favourite,count_audio,count_video,count_articles from events;")
result = [dict(zip(tuple (query.keys()),i)) for i in query.cursor]
return jsonify(result)
api.add_resource(Events,'/events') # Route_1
if __name__ == '__main__':
app.run(port='5002')
和一个嵌套对象tags
,如下所示
location
像这样甚至有可能吗?我是否需要重新考虑API以使端点覆盖每个嵌套对象?
[{
"description": "TEST DESCRIPTION","id": 1,"title": "TEST TITLE","date": "2020-09-02","scheduled":"true","favourite":"true","tags": ["celebration","national holiday"],"location": {
"state": {
"name": "new zealand","affiliation": ["United Nations"]
},"province": "","urbanisation": "Wellington"
}
},{
"description": "LONG DESCRIPTION","id": 2,"title": "SECOND ENTRY","date": "2020-09-03","scheduled":"false","favourite":"false","tags": ["election","location": {
"state": {
"name": "Brazil","affiliation": [""]
},"urbanisation": ""
}
}]
或者,我是否像this answer一样嵌套字典。
解决方法
是的,它可能并且完全有效。但是我不会直接查询数据库。我会使用SQLAlchemy之类的ORM,因为烧瓶使用可以使用flask-sqlalchemy扩展名。可以使用flask-marshmallow
实现序列化使用SQLAlchemy创建模型:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = SQLAlchemy(app)
class EventModel(db.Model):
__tablename__ = "event"
id = db.Column(db.Integer,primary_key=True)
title = db.Column(db.String,nullable=True)
class LocationModel(db.Model):
__tablename__ = "location"
id = db.Column(db.Integer,primary_key=True)
province = db.Column(db.String,nullable=True)
event_id = db.Column(db.Integer,db.ForeignKey("event.id",ondelete="CASCADE"),nullable=False)
event = db.relationship("EventModel",backref=db.backref("locations",lazy=True))
然后,您需要序列化程序类(使用flask-marshmallow)来处理序列化:
from marshmallow_sqlalchemy import SQLAlchemyAutoSchema,fields
from marshmallow_sqlalchemy import auto_field
class LocationSchema(SQLAlchemyAutoSchema):
class Meta:
model = LocationModel
load_instance = True
include_fk = False
id = auto_field(load_only=True)
class EventSchema(SQLAlchemyAutoSchema):
class Meta:
model = EventModel
load_instance = True
include_fk = False
id = auto_field(load_only=True)
locations = fields.Nested(LocationSchema,many=True)
最后,您可以如下序列化为json:
db.drop_all()
db.create_all()
event = EventModel(title="Summer Show")
db.session.add(event)
db.session.commit()
location1 = LocationModel(province="Upper Austria",event_id=event.id)
db.session.add(location1)
location2 = LocationModel(province="Tirol",event_id=event.id)
db.session.add(location2)
db.session.commit()
schema = EventSchema()
result = db.session.query(EventModel).all()
print(schema.dump(result,many=True))
可以找到完整的教程here。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。