Django CSV导出..在列表中迭代

时间:2012-02-16 07:33:20

标签: python django excel csv export

我正在查看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对象的地方。但是我一直得到一个没有任何意义的语法错误..我甚至正确地解决了这个问题吗?

2 个答案:

答案 0 :(得分:2)

  1. 您在列表定义中缺少终止]
  2. 您不能在列表中放置for循环。
  3. 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 listTrue - 那么[x.A, x.B] + x.C.all + [x.D,]就足够了。

    • c_list = [item for item in x.C.all]列表理解,它允许您在不必编写for循环的情况下对列表执行操作。

      列表理解非常强大,非常优雅,你应该使用它们,只要它有意义。任何时候你需要根据另一个列表制作一个列表,按一些标准过滤列表中的项目,或同时按两个标准过滤列表,列表理解可能是一个很好的方法。

    • xABCD这样的单字母变量名称非常糟糕,因为它们没有提供任何信息变量包含哪些数据,类型可能包含的内容,可能包含的值等等。如果可以,请使用更具描述性的变量名称。

答案 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。