【问题标题】:How to convert results of Model queries into xlsx using pandas in python?如何在 python 中使用 pandas 将模型查询的结果转换为 xlsx?
【发布时间】:2015-08-23 23:39:24
【问题描述】:

我的项目中有一个标准模型的集合,如下所示:

class Dimension(models.Model):
    dimension_id = MyCharField(max_length=1024, primary_key=True)
    name = MyCharField(max_length=255, null = False, unique=True)
    external_flg =  models.BooleanField(default = False)
    ext_owner = MyCharField(max_length=30, null = True)
    ext_table_name = MyCharField(max_length=30, null = True)
    ext_start_date_column_name = MyCharField(max_length=30, null = True)
    ext_end_date_column_name = MyCharField(max_length=30, null = True)
    ext_id_column_name = MyCharField(max_length=30, null = True)
    ext_name_column_name = MyCharField(max_length=30, null = True)
    ext_where_codition = MyCharField(max_length=512, null = True)
    def save(self):
        cnt =self.__class__.objects.filter(name=self.name).count()
        if cnt==0:
            if self.pk:
                super(Dimension, self).save()
            else:
                self.dimension_id = getUid()
                super(Dimension, self).save()
        else:
            raise DimensionUniqueError(self.name)

此时,我必须实现一个按钮,它将数据从我们的模型导入 xlsx 文件并在客户端自动下载。

我们计划使用 pandas 进行 sql 到 xlsx 的转换,但我不明白如何为模型实现与 pandas 的交互。现在我是这样实现的:

import pandas as ps

class Excel:
    def __init__(self, model_name):
        self.model_name = model_name
    def sql_to_xlsx():
        elements = self.model_name.objects.all()
        filter = self.request.GET.get('filter', None)

        if filter is not None:
            elements = elements.filter(filter_field=filter)
            columns = [desc[0] for desc in elements]
            data = [desc[1:] for desc in elements]
            df = ps.DataFrame(list(data), columns)
            writer = ps.ExcelWriter('converted.xlsx')
            df.to_excel(writer, sheet_name='converted')
            return writer.save()

    def get(self, request, *args, **kwargs):
        document = self.sql_to_xlsx()
        _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

但这不是我所期望的正确逻辑。我觉得这不是正确的做法。

您能帮我试试如何为我们的模型实现所需的逻辑吗? 谢谢!

【问题讨论】:

    标签: python sql django excel pandas


    【解决方案1】:

    我认为你不需要 pandas 来写 excel。

    我会使用openpyxl 来写入excel。只需按照他们页面上的示例对您来说就足够了。您只需遍历您的模型并使用 openpyxl 写入您想要的特定行和列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-16
      • 1970-01-01
      • 2021-09-11
      • 2017-10-15
      • 1970-01-01
      • 2017-10-03
      • 2018-01-21
      相关资源
      最近更新 更多