我正在尝试使用SQLAlchemy-DataTables来构建具有服务器端处理功能的表,
@app.route("/data", methods=['GET'])
def data():
columns = [
ColumnDT(Customer.id),
ColumnDT(Customer.Email),
]
query = db.session.query(Customer)
params = request.args.to_dict()
rowTable = DataTables(params, query, columns)
print(query , file=sys.stdout)
return jsonify(rowTable.output_result())
在调试模式下运行时,我可以看到rowTable.output_result()返回:
{'draw': '1', 'recordsTotal': '13997', 'recordsFiltered': '13997', 'data': [{'0': <Customer#1>, '1': 1}, {'0': <Customer#2>, '1': 2}, {'0': <Customer#3>, '1': 3}, {'0': <Customer#4>, '1': 4}, {'0': <Customer#5>, '1': 5}, {'0': <Customer#6>, '1': 6}, {'0': <Customer#7>, '1': 7}, {'0': <Customer#8>, '1': 8}, {'0': <Customer#9>, '1': 9}, {'0': <Customer#10>, '1': 10}]}
但是出现以下错误: TypeError:类型为Customer的对象不可JSON序列化
我按照文档进行了所有操作,所以我不知道为什么它不起作用
答案 0 :(得分:2)
问题是您试图在python对象jsonify()
上调用<Customer>
。要了解为什么会这样,请查看您的输出:
{
'draw': '1',
'recordsTotal': '13997',
'recordsFiltered': '13997',
'data': [{
'0': < Customer1 > ,
'1': 1
}, {
'0': < Customer2 > ,
'1': 2
}, {
'0': < Customer3 > ,
'1': 3
}, {
'0': < Customer4 > ,
'1': 4
}, {
'0': < Customer5 > ,
'1': 5
}, {
'0': < Customer6 > ,
'1': 6
}, {
'0': < Customer7 > ,
'1': 7
}, {
'0': < Customer8 > ,
'1': 8
}, {
'0': < Customer9 > ,
'1': 9
}, {
'0': < Customer10 > ,
'1': 10
}]
}
在'data'
内部,您无法通过json.dumps()
自动序列化对象,而jsonify()
可以有效地为您执行这些操作。
要解决此问题,您需要修改输出,以使json.dumps()
具有更多无聊的数据类型可以使用。例如:
for item in rowTable.output_result()['data']:
item['0'] = {
'customer_id': item['0'].id,
# and so on for the other properties you're interested in
}
您还可以在<Customer>
类上编写一个函数,该函数会自动序列化所有重要属性,然后您可以执行以下操作:
for item in rowTable.output_result()['data']:
item['0'] = item['0'].serialized
以及如何在课堂上做到这一点的示例:
class Customer(Model):
id = Column(Integer)
# etc...
@property
def serialized(self):
return {
'id': self.id
}