首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Flask:应为可迭代,而不是InstanceState

Flask:应为可迭代,而不是InstanceState
EN

Stack Overflow用户
提问于 2018-07-27 03:58:07
回答 1查看 36关注 0票数 1

我只是尝试查看对象的查询集,并写入csv导出:

代码语言:javascript
复制
@expose('/csv-export')
def csv_export(self):
    batch_num = request.args.get('batch_num')

    if not batch_num:
        flash('Invalid batch id', 'danger')
        abort(404)

    si = io.StringIO()
    cw = csv.writer(si)

    # array
    my_objects = MyObject.query.filter_by(batch_num=batch_num).all()

    row_headers = my_objects[0].serialize()
    cw.writerow(row_headers)

    object_rows = []
    for my_object in my_objects:
        for k, v in vars(my_object).items():
            object_rows.append(v)

    cw.writerows(object_rows)
    output = make_response(si.getvalue())
    output.headers["Content-Disposition"] = "attachment; filename=export.csv"
    output.headers["Content-type"] = "text/csv"
    return output

如果我检查object_rows是什么,它看起来像这样:

代码语言:javascript
复制
[<sqlalchemy.orm.state.InstanceState object at 0x7f92a791a390>, 2, None, '3312363552684', 551, None, '24daae41-82f5-42bf-b12f-9762554ee394', <sqlalchemy.orm.state.InstanceState object at 0x7f92a791a588>,   ]

我做错了什么?

EN

回答 1

Stack Overflow用户

发布于 2018-07-27 06:23:05

代码语言:javascript
复制
for my_object in my_objects:
        for k, v in vars(my_object).items():
            object_rows.append(v)

SQLAlchemy在SQLAlchemy内部使用的一个名为_sa_instance_state的仪表化对象的每个实例上创建一个属性。当您使用vars()遍历对象的__dict__时,这个键/值对将与所有其他属性键/值一起遍历。

因此,解决方案是将其过滤掉。一种常见的方法是根据键是否以前导下划线开头过滤掉键,例如:

代码语言:javascript
复制
for my_object in my_objects:
        for k, v in vars(my_object).items():
            if not k.startswith(‘_’):
                object_rows.append(v)

这将过滤掉所有私有属性,但如果有其他私有属性值需要捕获,则可以更具体地进行过滤。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51546624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档