reactjs - 将从用户文件上传的 csv 数据添加到 django 模型
问题描述
抱歉,如果这是一个愚蠢的问题,但我找不到一种简单/最新的方法来从用户在前端(React)上更新的 .csv 文件填充 Django 模型。我设法使用 axios 将上传的文件从反应前端发送到后端,我可以在后端捕获文件,但我不知道用 csv 数据填充模型的正确方法......
谢谢!!
应用程序.js
// frontend/src/App.js
import React, { Component } from "react";
import axios from "axios";
import { Button, FormGroup, Form } from "react-bootstrap";
class App extends Component {
handleFile = (event) => {
event.preventDefault();
const fileToUpload = event.target.files[0];
this.setState({
fileToUpload: fileToUpload,
});
};
handleSubmitData = (event) => {
event.preventDefault();
let formData = new FormData();
formData.append("file", this.state.fileToUpload);
axios
.post("data/", formData)
.then((response) => {
console.log(response);
})
.catch((error) => {
console.log(error.response);
});
};
render() {
return (
<main className="content">
<h1 className="text-white text-uppercase text-center my-4">
Price comparison
</h1>
<form onSubmit={this.handleSubmitData}>
<FormGroup>
<Form.Label>Upload file</Form.Label>
<Form.Control type="file" onChange={this.handleFile}></Form.Control>
</FormGroup>
<Button block bssize="large" type="submit">
Submit
</Button>
</form>
</main>
);
}
}
export default App;
模型.py
from django.db import models
class Data(models.Model):
city = models.CharField(max_length=200, null=True)
wheel_type = models.CharField(max_length=200, null=True)
order_status = models.CharField(max_length=200, null=True)
order_ID = models.IntegerField(null=True)
client_ID = models.IntegerField(null=True)
placed_time = models.DateTimeField(null=True)
order_date_time = models.DateTimeField(null=True)
origination_latitude = models.FloatField(null=True)
origination_longitude = models.FloatField(null=True)
destination_latitude = models.FloatField(null=True)
destination_longitude = models.FloatField(null=True)
surchage_total = models.FloatField(null=True)
transaction_value = models.FloatField(null=True)
total_price = models.FloatField(null=True)
def __str__(self):
return self.order_ID
视图.py
from rest_framework.response import Response
from rest_framework.parsers import MultiPartParser, FormParser
class RegisterData(views.APIView):
parser_classes = (FormParser, MultiPartParser)
def post(self, request):
for file in request.FILES.values():
print(file)
return Response({"success": "Good job, buddy"})
解决方案
您可能想看看批量创建方法:https ://books.agiliq.com/projects/django-orm-cookbook/en/latest/multiple_objects.html
# not sure about the right import
from .models import Data
class RegisterData(views.APIView):
parser_classes = (FormParser, MultiPartParser)
def post(self, request):
for file in request.FILES.values():
reader = csv.reader(file)
objects = []
for row in reader:
objects.append(Data(
city=row[0],
wheel_type=row[1],
# and so on ..
))
Data.objects.bulk_create(objects)
return Response({"success": "Good job, buddy"})
您可以使用 pandas 变得更高级 - 如果您的 CSV 的第一行恰好是与模型上的字段值相同的标题行,但我不建议仅仅为此而依赖 pandas。
推荐阅读
- javascript - 如何制作这样的预加载器,它叫什么?
- windows - 在 my.ini (Windows) 中设置证书路径后,MariaDB 变量“have_ssl”仍然禁用
- visual-studio - 为什么我在打开 Unity 时收到此套接字错误?我该如何解决?
- css - 背景图像显示带有滚动条
- java - 使用 Eclipselink 从 OracleDB 获取数据的时间很长
- elasticsearch - 弹性搜索按类型和索引获取文档与仅索引
- xml - xmlns 属性上的 Camel XPATH 选择包含
- python - pandas 中的 pd.concat 给出了 TypeError: cannot concatenate object of type '
'; 只有 Series 和 DataFrame obj 是有效的 - botframework - 在 MS Teams 中将 URL 作为弹出窗口/Iframe 打开
- python - 从 Python 中调用 Google Cloud 函数