我正在查看 django 文档,了解如何将数据导出到 CSV 文件,以便将其导入到 Excel 中。到目前为止,我已经可以正常工作了,但我在弄清楚如何导出模型中的多对多字段时遇到了一些麻烦。
到目前为止我已经
writer = csv.writer(response)
writer.writerow(['A','B', 'C', 'D'])
for x in case_log_list:
writer.writerow([x.A,
x.B,
for y in x.C.all:
y,
x.D)
其中 [list] 内的 for 循环是我尝试迭代该字段中的 ManyToMany 对象的地方。然而我不断收到一个没有任何意义的语法错误..我是否正确地处理了这个问题?
最佳答案
- 您的列表定义中缺少终止
]
。 - 不能将 for 循环放入列表中。
x.C 是某种列表或序列吗?您是否打算将 x.C 的每一项写入 CSV 中的单独字段?
我相信您打算使用列表串联运算符+
,它接受两个列表并将它们粘合在一起形成一个列表。像这样使用它:
>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> a + b
[1, 2, 3, 4, 5, 6]
你的例子变成:
for x in case_log_list:
c_list = [item for item in x.C.all] # turn x.C into a list
output_list = [x.A, x.B] + c_list + [x.D,] # assemble list
writer.writerow( output_list )
或者如果您想简短一点:
for x in case_log_list:
writer.writerow ( [x.A, x.B] + [item for item in x.C.all] + [x.D,] )
注释:
如果
x.C.all
已经是一个列表 - 也就是说,如果type(x.C.all) is list
为True
- 那么[x.A, x.B] + x.C.all + [x.D,]
就足够了。c_list = [item for item in x.C.all]
是一个列表理解,它允许您对列表执行操作,而无需编写for
循环。列表推导式非常强大、非常优雅,您应该在任何有意义的地方使用它们。任何时候您需要根据另一个列表创建一个列表,按某些条件过滤列表中的项目,或同时两者,列表理解可能是一个好方法。
单字母变量名称,例如
<x
、A
、B
、C
、D
确实很糟糕,因为它们没有提供有关变量保存哪些数据、其类型可能是什么、它可能包含哪些值等信息。如果可以的话,请使用更具描述性的变量名称。
关于python - Django CSV Export..在列表中迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9307227/