所以场景是这样的:我有一个搜索表单,用户可以在其中键入或选择条件。这些标准正在发布,我收到了一个返回的查询,使用这些条件进行过滤。搜索表单的代码类似于下面显示的代码。
我现在要做的是获取这些结果并将其导出到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
答案 0 :(得分:0)
你只看到一行,因为你只传了一行:
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