109.Django Rest获取数据数据保存Excel及下载
一.序列化和方序列化
(1)序列化:
将程序中的一个数据结构类型转换为其他格式(字典、JSON、XML等),例如将Django中的模型类对象装换为JSON字符串,这个转换过程我们称为序列化。
(2)反序列化:
将其他格式(字典、JSON、XML等)转换为程序中的数据,例如将JSON字符串转换为Django中的模型类对象,这个过程我们称为反序列化。
以上的两种的序列化的方式在写rest api 的时候会频繁的使用这两种序列化的方式。
二.搜索引擎。
1.搜索量小:whoosh +jieba--+--jieba分词查库(倒排索引)
2.搜索量大:ElasticSearch/Solr-- +ik-analysis/smartcn/pinying i--+--分词插件(最有名的倒排索引)
倒排索引:关键----------->文章。正常的是从文章---------->键字。
三.将数据写入Excel文件中并进行下载
1.查询数据
def export_excel(requset):
# 查询数据
rows = ()
agents = ()
with connection.cursor() as cursor:
cursor.execute(
"select t1.agentid, name, tel, total from tb_agent t1 inner join (select agentid, count(agentid) as total from tb_agent_estate group by agentid) t2 on t1.agentid=t2.agentid")
agents = cursor.fetchall()
2.创建Excel工作簿和工作表
# 导入到Excel中
# 创建工作簿
workbook = xlwt.Workbook()
# 创建工作表
sheet = workbook.add_sheet("经理人统计表")
titles = ("编号", "姓名", "联系电话", "楼盘数量")
for col, title in enumerate(titles):
sheet.write(0, col, title)
for row, agent in enumerate(agents):
for col in range(4):
sheet.write(row + 1, col, agent[col])
3.保存和更改文件名
buffer = BytesIO() #代表内存的数据---str(不能改写)----StringIO(写这个改写)
# 保存到本地的内存 BytesIO()--改写bytes类型的数据
workbook.save(buffer)
resp=HttpResponse(buffer.getvalue(),content_type="application/vnd.ms-excel")
resp["content-disposition"]='attachment;filename="data.xls"' #更改相应的头---如何处置文件
return resp
4.完整的代码:
def export_excel(requset):
# 查询数据
rows = ()
agents = ()
with connection.cursor() as cursor:
cursor.execute(
"select t1.agentid, name, tel, total from tb_agent t1 inner join (select agentid, count(agentid) as total from tb_agent_estate group by agentid) t2 on t1.agentid=t2.agentid")
agents = cursor.fetchall()
# 导入到Excel中
# 创建工作簿
workbook = xlwt.Workbook()
# 创建工作表
sheet = workbook.add_sheet("经理人统计表")
titles = ("编号", "姓名", "联系电话", "楼盘数量")
for col, title in enumerate(titles):
sheet.write(0, col, title)
for row, agent in enumerate(agents):
for col in range(4):
sheet.write(row + 1, col, agent[col])
buffer = BytesIO() # 代表内存的数据---str(不能改写)----StringIO(写这个改写)
# 保存到本地的内存 BytesIO()--改写bytes类型的数据
workbook.save(buffer)
resp = HttpResponse(buffer.getvalue(), content_type="application/vnd.ms-excel")
resp["content-disposition"] = 'attachment;filename="data.xls"' # 更改相应的头---如何处置文件
return resp
# 打开直接inline 下载就是attachment
# 用中文对文件命名必须使用百分号进行编码
对于其中需要特殊说明的地方进行说明:
1.创建工作簿和表
创建Excel步骤.jpg
2.文件的类型:content_type="application/vnd.ms-excel"
3.resp["content-disposition"] = 'attachment;filename="data.xls"'---相应的头---如何处置文件。
4.打开直接inline 下载就是attachment
5.用中文对文件进行命名的时候需要用百分号进行编码:
导入
from urllib.parse import quote
文件名是中文的处理.png
四.BytesIO()和StringIO
说明:很多时候,数据读写不一定是文件,也可以在内存中读写,这时候就可以用到这两个。
1.BytesIO()
要把str写入StringIO,我们需要先创建一个StringIO,然后,像文件一样写入即可,getvalue()方法用于获得写入后的str。
>>> from io import StringIO
>>> f = StringIO()
>>> f.write('hello')
5
>>> f.write(' ')
1
>>> f.write('world!')
6
>>> print(f.getvalue())
hello world!
2.StringIO
写入的不是str,而是经过UTF-8编码的bytes。
和StringIO类似,可以用一个bytes初始化BytesIO,然后,像读文件一样读取
>>> from io import BytesIO
>>> f = BytesIO(b'\xe4\xb8\xad\xe6\x96\x87')
>>> f.read()
b'\xe4\xb8\xad\xe6\x96\x87'