我有一个jquery脚本发送ajax post请求到我的烧瓶服务器上的路由 . 我希望路由计算SQLAlchemy选择查询并将结果返回到jquery脚本 .
问题是我无法找到一种简单而通用的方法将sqlalchemy查询结果直接转换为json,或javascript可理解的其他格式 .
所以目前我必须为我的所有sqlalchemy类编程一个长的专用“serialize()”函数来强制str()像datetime这样的危险类型,然后jsonify它 .
但我希望只有一个函数可以直接转换sqlalchemy请求结果的一行,而不是每个sqlalchemy类的专用函数 .
这是我现在正在做的一个例子:
VIEWS中的路线:
@app.route('/ajax/programme', methods=['POST'])
def retrieve_programme():
if request.method == 'POST':
shows_list = Shows.query.all()
result = []
for i in shows_list:
result.append(i.serialize(['id', 'date', 'title']))
return json.dumps(result)
我的SHOWS模型,带有序列化功能:
class Shows(db.Model):
__tablename__ = "shows"
id = Column(db.Integer, ForeignKey("programmation.id"), primary_key=True)
date = Column(db.DATETIME)
title = Column(db.VARCHAR(50))
short_description = Column(db.VARCHAR(200))
type = Column(db.VARCHAR(20))
background_image = Column(MEDIUMBLOB)
content = Column(LONGTEXT)
def serialize(self, whatTo):
result = {}
if 'id' in whatTo:
result['id'] = self.id
if 'date' in whatTo:
result['date'] = str(self.date)
if 'title' in whatTo:
result['title'] = self.title
if 'short_description' in whatTo:
result['short_description'] = self.short_description
if 'type' in whatTo:
result['type'] = self.type
if 'background_image' in whatTo:
result['background_image'] = self.background_image
if 'content' in whatTo:
result['content'] = self.content
return result
jQuery的:
$.post("http://127.0.0.1:5000/ajax/programme", {year: '2017', semester: 1}, function(result){
console.log(result);
});
所以我无法相信烧瓶和js与这一点不相容,或者sqlalchemy devs没有开发出什么东西 . 我必须错过一些东西!
谢谢
1 回答
您可能需要考虑https://jsonpickle.github.io,它可以序列化任何Python对象:
在使用SQLAlchemy进行100%清理之前,您应该考虑将实例设置为瞬态或分离 . http://docs.sqlalchemy.org/en/latest/orm/session_api.html#sqlalchemy.orm.session.make_transient
SQLAlchemy和jsonpickle两个具有隐藏字段的工具类都能够正确反序列化,因此如果您不想在以后重新将它们附加到会话中,则会污染有效负载 . 如果您的用例是暂时/只读访问,您可以使用以下代码擦除代码: