我只是试图浏览对象的查询集并写入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
我在做什么错了?
答案 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)
这将过滤掉所有私有属性,但是如果要捕获其他私有属性值,则可以更具体地进行过滤。