我正在查看django文档,了解如何将我的数据导出到CSV文件,以便将其导入到Excel中。到目前为止,我得到了它的工作,但我有点麻烦搞清楚如何导出我的模型中的ManyToMany字段。
到目前为止我已经
了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对象的地方。但是我一直得到一个没有任何意义的语法错误..我甚至正确地解决了这个问题吗?
答案 0 :(得分:2)
]
。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
这样的单字母变量名称非常糟糕,因为它们没有提供任何信息变量包含哪些数据,类型可能包含的内容,可能包含的值等等。如果可以,请使用更具描述性的变量名称。
答案 1 :(得分:1)
在将数据插入csv之前,必须先创建数据。
您可以在执行写入操作之前获取所有写入数据。
mydata = [x.A,x.B]
mydata += [y for y in x.C.all]
mydata.append(x.D)
# write mydata to the csv.
这样您就可以获得数据并直接写入csv。