使用原始的sql导出到django中的CSV / Excel文件

在django中生成excel / csv文件的问题主要是因为我正在使用raw sql查询数据库(直接)。 我只能访问数据库而不是模型类。 这是我的代码片段。

我得到一个错误“字典”对象没有属性“todo_job”

查看代码

def query_to_dicts(query_string, *query_args): """Run a simple query and produce a generator that returns the results as a bunch of dictionaries with keys for the column values selected. """ #log.debug(str(dir(connection))) cursor = connection.cursor() #log.debug(str(dir(cursor))) cursor.execute(query_string, query_args) #log.debug(cursor.rowcount)log col_names = [desc[0] for desc in cursor.description] #log.debug(str(col_names)) while True: row = cursor.fetchone() if row is None: break row_dict = dict(izip(col_names, row)) yield row_dict return def excel(request): todo_obj = query_to_dicts('''SELECT * FROM users''') response = HttpResponse(mimetype='application/ms-excel') response['Content-Disposition'] = 'attachment; filename=elagu.xls' wb = xlwt.Workbook(encoding='utf-8') ws = wb.add_sheet("Todo") row_num = 0 columns = [ (u"ID", 6000), (u"t_stamp", 8000), ] font_style = xlwt.XFStyle() font_style.font.bold = True for col_num in xrange(len(columns)): ws.write(row_num, col_num, columns[col_num][0], font_style) # set column width ws.col(col_num).width = columns[col_num][1] font_style = xlwt.XFStyle() font_style.alignment.wrap = 1 for obj in todo_obj: row_num += 1 row = [ row_num, obj.todo_job, obj.created_date.strftime("%A %d. %B %Y"), ] for col_num in xrange(len(row)): ws.write(row_num, col_num, row[col_num], font_style) wb.save(response) return response 

您正尝试访问在这些位置不存在的dict对象的属性:

 obj.todo_job obj.creation_date 

要在Python中访问dict的值,需要使用带有相关键的下标运算符( [] )作为string,从而可以:

 obj['todo_job'] obj['creation_date'] 

有关更多信息,请参阅Python dict文档 。