首页 > 解决方案 > 将 CSV 导入 Django,保存数据并在模板中显示结果

问题描述

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

标签: python-3.xdjangodjango-viewsdjango-templates

解决方案


我曾在一些类似的项目中工作过,接收 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。


推荐阅读