如何以JSON的形式返回结果列表?

时间:2014-11-07 01:39:50

标签: python sqlalchemy flask-sqlalchemy

我想将查询结果作为JSON返回。我使用以下路由将一个模型实例作为JSON对象返回。

@mod.route('/autocomplete/<term>', methods=['GET'])
def autocomplete(term):

    country = Country.query.filter(Country.name_pt.ilike('%'+ term + '%')).first()

    country_dict = country.__dict__
    country_dict.pop('_sa_instance_state', None)

    return jsonify(json_list=country_dict) 

如果我使用first()方法,此代码效果很好。但是,我需要使用all()来获取所有结果。当我这样做时,我收到以下错误。

country_dict = country.__dict__
AttributeError: 'list' object has no attribute '__dict__'

我应该怎么做才能将整个结果列表作为JSON返回?

1 个答案:

答案 0 :(得分:5)

你需要这样做&#34; jsonify准备步骤&#34;对于列表中的每个项目,因为.all()返回模型实例列表,而不仅仅是.first()之类的一个实例。处理每个__dict__的副本,这样就不会搞乱SQLAlchemy对实例的内部表示。

@mod.route('/autocomplete/<term>', methods=['GET'])
def autocomplete(term):
    countries = []

    for country in Country.query.filter(Country.name_pt.ilike('%' + term + '%'):
        country_dict = country.__dict__.copy()
        country_dict.pop('_sa_instance_state', None)
        countries.append(country_dict)

    return jsonify(json_list=countries)

可能更好的方法是明确地返回有关每个国家/地区的数据,而不是试图对该实例进行神奇的json化。

@mod.route('/autocomplete/<term>', methods=['GET'])
def autocomplete(term):
    countries = []

    for country in Country.query.filter(Country.name_pt.ilike('%' + term + '%'):
        countries.append({
            'id': country.id,
            'name': country.name_pt,
        })

    return jsonify(countries=countries)