Django将过滤的查询导出到csv

达娜(Danae Vogiatzi)

因此,情况是这样的:我有一个搜索表单,用户可以在其中键入或选择条件。这些条件已发布,并且我收到了返回的查询,并使用这些条件进行了过滤。搜索表单的代码类似于下面显示的代码。

我现在想做的就是获取这些结果并将其导出到csv文件中。因此,正如我所说的,使用GET获取参数/条件时,我几乎使用相同的代码。基本上,我是在执行搜索POST之后获取用户键入或选择的条件的。

到目前为止,我已经成功获取了参数,我可以看到它们在打印中,并且导出失败了,但是我只能看到第一行。就像我无法通过查询(结果中提供的那样)。

这是我的代码:

    def get_csv(request):
        response = HttpResponse(content_type='text/csv')
        response['Content-Disposition'] = 'attachment; filename=mycsv.csv'
        if request.method == 'GET':
            params = {}
            your_values = {}
            context = {}
            field_1 = request.GET.get('field_1',None)
            field_2 = request.GET.get('field_2',None)
            field_3 = request.GET.get('field_3',None)
            if field_1:
                your_values['field_1'] = field_1
            if field_2:
                your_values['field_2'] = field_2
            if field_3:
                your_values['field_3'] = field_3
            if field_4:
                your_values['field_4'] = field_4
            for key, value in your_values.items():
                if value:
                    params[key] = value
                print('params are:',params)
            results = Model.objects.filter(**params)
            writer = csv.writer(response)
            writer.writerow([h for h in [
                'Header_1',
                'Header_2',
                'Header_3',
                'Header_4',
                ]])
          #I tried that as well:writer.writerows([r for r in[results]])
            for field in results:
                field_list = [
                field.filed_1,
                field.field_2,
                field.field_3,
                field.field_4,
               ]
            for i, item in enumerate(field_list):
                if item:
                    field_list[i] = item
                    writer.writerow(field_list)
        return response
摩西·科莱多耶(Moses Koledoye)

您只看到一行,因为您只通过了一行:

for field in results:
     field_list = [
     field.filed_1,
     field.field_2,
     field.field_3,
     field.field_4,
     ]

上面仅放置了上次迭代中的项目,field_list而丢弃了先前的结果。

您可以改为使用列表推导来创建列表列表,同时使用添加索引enumerate然后使用writerows以下命令同时写入所有行

results = Model.objects.filter(**params)
writer = csv.writer(response)
writer.writerow(['Header_1', 'Header_2', 'Header_3', 'Header_4'])     
field_list = [[i, f.field_1, f.field_2, f.field_3, f.field_4] 
                         for i, f in enumerate(results) if f]
writer.writerows(field_list)
#              ^ notice the s

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章