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

use*_*084 0 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) 
Run Code Online (Sandbox Code Playgroud)

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

country_dict = country.__dict__
AttributeError: 'list' object has no attribute '__dict__'
Run Code Online (Sandbox Code Playgroud)

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

dav*_*ism 5

您需要为列表中的每个项目执行"jsonify准备步骤",因为.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)
Run Code Online (Sandbox Code Playgroud)

可能更好的只是明确地返回有关每个国家/地区的数据,而不是试图神奇地对实例进行jsonify.

@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)
Run Code Online (Sandbox Code Playgroud)