【问题标题】:Import CSV to Django, save data and show results within template将 CSV 导入 Django,保存数据并在模板中显示结果
【发布时间】:2020-07-03 12:54:26
【问题描述】:

我需要您的帮助,将数据(CSV)上传到 django 应用程序并将数据保存到数据库。我还想在模板中显示逐行结果。附上页面图片供您参考。请指导我如何实现相同的。image

【问题讨论】:

    标签: python-3.x django django-views django-templates


    【解决方案1】:

    我曾在一些类似的项目中工作过,接收 csv 并将数据上传到不同的数据库中。 我使用 pandas 来处理不同类型的用户友好的表格扩展,但如果你只使用 csv,你可以使用 python 中的 csv 库。 您可以简单地放置一些表格来上传 csv 以允许用户将文件发送到 django 应用程序。

    这些示例我们使用它来捕获 xlsx 文件,然后转换为数据帧(使用 pandas)以便于处理。

    archiveXLSX = request.FILES['xlsx_file']
    df = pd.read_excel(archiveXLSX,keep_default_na=False)
    

    现在您在 django 后端拥有数据,需要转换这些数据并确定这些数据可以加载到数据库中。

    在所有验证后,我们将数据放入列表中(不保存)。

    list_example = [
       ExampleModel(data1,data2,data3),
       ExampleModel(data1,data2,data3),
    ]
    

    要上传到数据库,有趣的是使用 bulk_create 插入数据(以避免执行多次插入)bulk_create 可以比一个一个创建一个更快。

    例如:

    ExampleModel.objects.using('database').bulk_create(list_example)
    

    因此,如果您想在模板中显示这些数据,我建议您在数据库中创建一些表格,该表格将指示上传日期、用户上传的文件以及从这些文件上传的数据的 ID。例如:

    id, file_name ,      date    , id_data
    1 ,example.csv,20 - 04 - 2020, 2
    2 ,example.csv,20 - 04 - 2020, 4
    3 ,example.csv,20 - 04 - 2020, 2
    

    现在。要处理这两个模型,您需要创建 csv 模型对象,同时为来自 csv 的数据创建模型对象(确保首先保存来自 csv 的数据的模型,在这种情况下是 ExampleModel)。

    让我们假设谁在验证这些数据后,处理这些常见的事情。你把它们放在某个字典里,保存它们的功能可以是这样的:

    csvDataToCreate = []
    dataToCreate = []
    for data in dataDict:
        example = ExampleModel(data['data1'],data['data2'],data['data3'])
        dataToCreate.append(example)
        csvData = ExampleCsvModel(filename, datetime.now().date(), example)
        csvDataToCreate.append(csvData)
    

    现在您拥有所需的所有信息。 csvData 的视图可以是一个简单的选择。

    csvData.objects.filter(file_name='file.csv',date='xx-xx-xxxx')
    

    模板也很简单:

      <table class="table table-striped">
    <thead>
      <tr>
        <th scope="col" style="width: 35%;">data1</th>
        <th scope="col" style="width: 45%;">data2</th>
        <th scope="col" style="width: 5%;">data3</th>
      </tr>
    </thead>
    <tbody>
      {% for csv in csvitens %}
        <tr>
          <td style="width: 35%;"><div class='btn'>{{csv.id_data.data1}}</div></td>
          <td style="width: 35%;"><div class='btn'>{{csv.id_data.data2}}</div></td>
          <td style="width: 35%;"><div class='btn'>{{csv.id_data.data3}}</div></td>
        <tr>
      {% endfor %}
        </tbody>
      </table>
    

    对于这个任务,您可以使用您选择的 css 框架,这里我使用了 boostrap4。

    【讨论】:

      猜你喜欢
      • 2021-04-29
      • 1970-01-01
      • 2021-02-10
      • 2011-02-27
      • 2019-04-05
      • 2012-03-18
      • 2018-02-01
      • 2021-11-17
      • 2016-03-16
      相关资源
      最近更新 更多