Python 使用Django下载xlsx格式的SQL数据

Python 使用Django下载xlsx格式的SQL数据,python,django,excel,pandas,Python,Django,Excel,Pandas,我必须编写一个函数,在输入时有一个表名和查询的条件/过滤器,在输出时返回一个链接,客户端(浏览器)应自动下载该链接 如何使用python/django实现此任务 例如,我写了一小段代码,但我不确定它是否正常工作,并且没有实现查询条件解析(我不知道如何实现它): 直接_db.py: from django.db import connection class DirectSQL: def __init__(self,in_sql): self.sql=in_sql

我必须编写一个函数,在输入时有一个表名和查询的条件/过滤器,在输出时返回一个链接,客户端(浏览器)应自动下载该链接

如何使用python/django实现此任务

例如,我写了一小段代码,但我不确定它是否正常工作,并且没有实现查询条件解析(我不知道如何实现它):

直接_db.py:

from django.db import connection

class DirectSQL:
    def __init__(self,in_sql):
        self.sql=in_sql
        self.cursor = connection.cursor()
        self.cursor.execute(in_sql)
    def getDescription(self):
        columns = [desc[0] for desc in self.cursor.description]
        return columns
    def getResult(self):
        row = self.cursor.fetchall()
        return row
    def getResultAsDict(self):
        desc = self.cursor.description
        return [dict(zip([col[0].lower() for col in desc], row)) for row in self.cursor.fetchall()]
excel.py:

from ecc.direct_db import DirectSQL
import pandas as ps

class Excel:
    def __init__(self, table_name):
        self.table_name = table_name
    def convert(in_args):
        q = DirectSQL("select * from self.table_name" ) # where... order by... like...
        columns = [desc[0] for desc in q.getDescription()]
        data = q.getResults()
        df = ps.DataFrame(list(data), columns)
        writer = ps.ExcelWriter('converted.xlsx')
        df.to_excel(writer, sheet_name='converted')
        writer.save()

我以前做过类似的工作,我使用了
xlsxwriter
,您可以查看它,了解如何创建xlsx以及如何将数据设置到其中。那么您应该需要一些视图:

from django.views.generic import View
from django.http import HttpResponse


class CreateReport(View):

    def get_data(self):
        # Query your data here, probably using self.request to get query string
        ...
        return data

    def generate_report(self):
        # Here you will create xlsx doc and populate with data according to docs linked before
        ...
        return workbook

    def get(self, request, *args, **kwargs):
        document = self.generate_report()
        _file = open(document.filename, 'r')

        response(HttpResponse(_file, content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'))
        response['Content-Disposition'] = 'attachment; filename=%s' % document.filename.split('/')[-1]  # Here will return a full path, that's why probably you will need a split to get only the filename
        add_never_cache_headers(response=response)  # To avoid download the same file with out of date data.
        return response
然后您需要一个
url

from myapp.views import CreateReport
url(r'^create_report/(?P<some_param_if_needed>[-\w]+)',
                       CreateReport.as_view(),
                       name='create_report'),

我还需要从sql->xlsx转换它,但我不知道如何使用where和like筛选器将其通用化为不同的查询。只需查询数据并对其进行交互。使用什么?QuerySet?我只需要一个简单的例子,在几个查询中包含like、where和orderby?因为我正在为136个表执行“转换和下载”按钮,这些表将显示在ExtJS中,并且每个表都有自己的排序和过滤。为什么不使用Django ORM呢?
<a href="{% url 'create_report' report_name %}">Download Report</a>
get_data(self):
    # Let's supose you have a `MyElements` model
    elements = MyElements.objects.all()

    # And let's supose you want to filter data with some GET parameter
    filter = self.request.GET.get('filter_name', None)

    if filter is not None:
        elements = elements.filter(filter_field=filter)

    return elements