不可序列化JSON-Python+;烧瓶+;炼金术
我正在编写一个小查询,从不可序列化JSON-Python+;烧瓶+;炼金术,python,mysql,json,flask,sqlalchemy,Python,Mysql,Json,Flask,Sqlalchemy,我正在编写一个小查询,从mysql数据库中获取数据, 我有一个报告表,里面有report\u id,我需要查询来自api参数的与report\u id匹配的数据 我的职能: def view_single_thumbnail(idx): // idx coming from params session = Session() result = session.query( Report ).filter( Report.report_
mysql
数据库中获取数据,
我有一个报告表,里面有report\u id
,我需要查询来自api
参数的与report\u id
匹配的数据
我的职能:
def view_single_thumbnail(idx): // idx coming from params
session = Session()
result = session.query(
Report
).filter(
Report.report_id == idx
).all()
return jsonify({
'data': result
})
抛出错误:
'0x00001C1FSDFSf51E6A90'处的components.db.core.table_declaration.Report对象不是JSON可序列化的
SQLAlchemy对象无法通过jsonify
自动序列化。您可以将属性添加到SQLAlchemy模型class
class Report(db.Model):
def __init__(self):
...
@property
def serialized(self):
"""Return object data in serializeable format"""
return {
'id': self.id,
'report_text': "Some text",
...
}
您的视图将更新为:
def view_single_thumbnail(idx): // idx coming from params
session = Session()
result = session.query(
Report
).filter(
Report.report_id == idx
).all()
return jsonify({
'data': [result.serialized for result in results]
})
SQLAlchemy对象不能通过
jsonify
自动序列化。您可以将属性添加到SQLAlchemy模型class
class Report(db.Model):
def __init__(self):
...
@property
def serialized(self):
"""Return object data in serializeable format"""
return {
'id': self.id,
'report_text': "Some text",
...
}
您的视图将更新为:
def view_single_thumbnail(idx): // idx coming from params
session = Session()
result = session.query(
Report
).filter(
Report.report_id == idx
).all()
return jsonify({
'data': [result.serialized for result in results]
})
如果我没记错的话,查询的结果就是一个对象,在尝试将其转换为json之前,应该先将其转换为
dict
。我在一个老项目中使用了一个简单的lambda
函数
# Lambda vesion
# row2dict = lambda r: {c.name: str(getattr(r, c.name)) for c in r.__table__.columns}
# Function version
def row2dict(row):
return {
c.name: str(getattr(row, c.name))
for c in row.__table__.columns
}
def view_single_thumbnail(idx): // idx coming from params
session = Session()
result = [
row2dict(report)
for report in session.query(Report)
.filter(Report.report_id == idx)
.all()
]
return jsonify({
'data': result
})
如果我没记错的话,查询的结果就是一个对象,在尝试将其转换为json之前,应该先将其转换为
dict
。我在一个老项目中使用了一个简单的lambda
函数
# Lambda vesion
# row2dict = lambda r: {c.name: str(getattr(r, c.name)) for c in r.__table__.columns}
# Function version
def row2dict(row):
return {
c.name: str(getattr(row, c.name))
for c in row.__table__.columns
}
def view_single_thumbnail(idx): // idx coming from params
session = Session()
result = [
row2dict(report)
for report in session.query(Report)
.filter(Report.report_id == idx)
.all()
]
return jsonify({
'data': result
})
我不能理解这一点,我是python/flask的初学者。我需要把它放在哪里?您必须将属性添加到
报告中。当您添加属性serialize
jsonify时,它将调用该属性以获取可序列化的字典。它应该是result.serialize
(不带括号)而不是result.serialize()
啊,我会解决这个问题。谢谢,你太棒了!(双关语)我不能理解这一点,我是python/flask的初学者。我需要把它放在哪里?您必须将属性添加到报告中。当您添加属性serialize
jsonify时,它将调用该属性以获取可序列化的字典。它应该是result.serialize
(不带括号)而不是result.serialize()
啊,我会解决这个问题。谢谢,你太棒了!(双关语)有没有不使用第三方库(如lambda)的方法?lamba
是python中的内置关键字。这只是声明函数的一种简化方式。row2dict实际上做什么?默认情况下,查询
返回一个对象,而不是可序列化的对象。row2dict
所做的是,它将运行对象的所有属性,Report
对象用于本例,然后将其转换为dict
。AttributeError:“Report”对象没有属性“id”,有没有不使用第三方库(如lambda)的方法?lamba
是python中的内置关键字。这只是声明函数的一种简化方式。row2dict实际上做什么?默认情况下,查询
返回一个对象,而不是可序列化的对象。row2dict
所做的是,它运行对象的所有属性,在这种情况下,Report
对象,然后将其转换为dict
。AttributeError:“Report”对象没有属性“id”