Flask:可迭代的预期值,而不是InstanceState

时间:2018-07-26 19:58:07

标签: python csv sqlalchemy

我只是试图浏览对象的查询集并写入csv导出:

" "

如果我检查@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

我在做什么错了?

1 个答案:

答案 0 :(得分:0)

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

SQLAlchemy在被检测的ORM对象的每个实例上创建一个属性,该对象称为_sa_instance_state,SQLAlchemy在内部使用该对象。当您使用__dict__遍历对象的vars()时,该键/值对将与所有其他属性键/值一起遍历。

因此解决方案是将其过滤掉。常用的方法是根据密钥是否以前划线开头,例如:

for my_object in my_objects:
        for k, v in vars(my_object).items():
            if not k.startswith(‘_’):
                object_rows.append(v)

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