当前位置:   article > 正文

Django 后台admin管理页面添加简易导出/下载数据功能的两种方法_django实现下载数据库中的数据

django实现下载数据库中的数据

在Django中有时候需要在后台界面需要用到导出数据的功能,对于功能要求比较高的可以直接使用Import_Export库来完成。但是对于一些简单的数据导出,可以直接自定义一些简单的函数来实现导出数据。

经过测试,有以下两种方法可以使用:HttpResponse 和  FileResponse 两种方法。

一、HttpResponse:

首先引入 from django.http import HttpResponse

添加导出动作:

actions = ['export_excel']

完整代码1:

  1. # 导出数据到EXCEL文件
  2. def export_excel(self, request, queryset):
  3. meta = self.model._meta
  4. # field_names = [field.name for field in meta.fields]
  5. # 如果直接按照数据库字段进行导出,直接使用上面的代码,如果需要进行部分字段的筛选,同时为导出的文件添加中文表头,可以使用下面的代码
  6. cn_name = ['区域', 'A库存数','A库存金额', 'B库存数', 'B库存金额', 'C库存数', 'C库存金额', '库存日期', '备注信息']
  7. field_names = ['quyu', 'Akcs', 'Akcj', 'Bkcs', 'Bkcj', 'Ckcs','Ckcj','kc_date', 'note']
  8. today_time = time.strftime('%Y%m%d%H%M%S', time.localtime())
  9. filename = f'{str(meta)[7:]}' + '_' + f'{today_time}'
  10. response = HttpResponse(content_type='application/msexcel')
  11. response['Content-Disposition'] = f'attachment; filename={filename}.xlsx'
  12. wb = Workbook()
  13. ws = wb.active
  14. # ws.append(field_names)
  15. ws.append(cn_name) # 写入中文表头
  16. for obj in queryset:
  17. for field in field_names:
  18. data = [f'{getattr(obj, field)}' for field in field_names]
  19. row = ws.append(data)
  20. wb.save(response)
  21. self.message_user(request, f"{request.user.username}导出库存数据<{filename}.xlsx>")
  22. return response
  23. export_excel.short_description = '下载数据'
  24. export_excel.type = 'info'
  25. export_excel.confirm = '确认即将开始导出差异数据!'

相关说明:

1、field_names = [field.name for field in meta.fields];

field_names 如果使用这个代码,是直接使用的数据库的全部字段;

field_names = [   ] 这个是在全部字段的基础上进行的筛选,只保留部分需要导出的字段,可以减小导出数据的体积;

2、表头的写入:

       ws.append(field_names) —— 这行代码值直接写入数据库字段定义的名称作为表头;虽然非中文不利于阅读,但是这种方式生成的文件适合作为数据库导入数据时的模板;

       ws.append(cn_name)  # 写入中文表头,方便阅读;但不适合作为数据导入模板;

3、filename的定义:

在定义filename的时候,加入了today_time的定义,而且将today_time定义到'%Y%m%d%H%M%S',是方便区分文件,便面固定文件名称在第二次导出的时候造成文件覆盖;同时还可以作为时间戳标记;

二、FileResponse:

首先导入:from django.http import FileResponse

添加动作:actions = ['export_excel','export_csv']

完整代码2:

  1. def export_csv(self, request, queryset):
  2. today_time = time.strftime('%Y%m%d%H%M%S', time.localtime())
  3. filename = '/logs/' + 'myform_' + f'{today_time}.csv'
  4. ids = list(queryset.values_list('quyu', 'wxkcs', 'wxkcj', 'dlkcs', 'dlkcj', 'zykcs','zykcj','note'))
  5. print(ids,type(ids))
  6. biaotou = '区域,A库存数,A库存金额,B库存数,B库存金额,C数量,C金额,备注\n'
  7. with open(filename, 'a+') as f:
  8. f.write(biaotou)
  9. for i in ids:
  10. f.write(str(i)[1:-3]+'\n')
  11. newname = f'kucun' + '_' + f'{today_time}.csv'
  12. response = FileResponse(open(filename, "rb"))
  13. response['Content-Type'] = 'application/octet-stream'
  14. response['Content-Disposition'] = f'attachment; filename={newname}'
  15. self.message_user(request, f"{request.user.username}导出库存数据<{newname}")
  16. return response
  17. export_csv.short_description = '下载数据CSV'
  18. export_csv.type = 'info'
  19. export_csv.confirm = '确认即将开始导出差异数据!'

相关说明:

1、导出文件的格式:

格式并不固定,可以是csv\txt\log等多种格式,这里选择csv是因为处理数据比较方便;

2、为什么非要保存为一个独立的文件?

这个地方原本是另外一个很复杂的函数,通过数据整合成为有固定格式的word文档,当然也可以是PDF文档;然后下载的是一个格式排版都比较精美的文档;为了简化代码,使主函数功能更清晰,这里就使用csv文件做简单的说明;

3、表头的汉字说明:

为了能使导出的数据更清晰,便于阅读,特意添加了一行中文的表头;

其他的内容都比较简单、清晰,可以结合第一种方法看一下。

这两种方法都可以实现简单的数据导出、下载功能;各有一定的作用。也可以在下载的同时,将文件同时保存在服务器以便备查;配合一些日志记录。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/729103
推荐阅读
相关标签
  

闽ICP备14008679号