【问题标题】:Add csv data uploaded from user file to django models将从用户文件上传的 csv 数据添加到 django 模型
【发布时间】:2021-01-24 12:41:42
【问题描述】:

对不起,如果这是一个愚蠢的问题,但我找不到一种简单/最新的方法来从用户在前端 (React) 上更新的 .csv 文件填充 Django 模型。我设法使用 axios 将上传的文件从反应前端发送到后端,我可以在后端捕获文件,但我不知道用 csv 数据填充模型的正确方法......

谢谢!!

App.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;

models.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

views.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"})

【问题讨论】:

    标签: reactjs django csv django-models django-rest-framework


    【解决方案1】:

    你可能想看看批量创建方法: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"})
    

    如果您的 CSV 的第一行恰好是与您的模型上的字段值相同的标题行,您可以使用 pandas 变得更有趣,但我不建议仅仅为此而依赖 pandas。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-17
      • 1970-01-01
      相关资源
      最近更新 更多