2

How can I send a 220,000-line CSV file to Django using the Rest Framework API? Thank you.

Botta
  • 43
  • 2
  • 6
  • Is this for testing? Here's a link to do this through Postman. https://stackoverflow.com/questions/43199786/add-csv-file-to-http-post – Ben Baik Feb 09 '21 at 22:35

3 Answers3

0

@Botta- How about something like this from django.db import models

Create your models here.

class MyFile(models.Model):
    file = models.FileField(blank=False, null=False,upload_to='images/')
    description = models.CharField(null=True,max_length=255)
    uploaded_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        verbose_name_plural = 'MyFiles'


class MyFileView(APIView):
    # MultiPartParser AND FormParser
    # https://www.django-rest-framework.org/api-guide/parsers/#multipartparser
    # "You will typically want to use both FormParser and MultiPartParser
    # together in order to fully support HTML form data."
    parser_classes = (MultiPartParser, FormParser)

    def post(self, request, *args, **kwargs):
        file_serializer = MyFileSerializer(data=request.data)
        if file_serializer.is_valid():
            file_serializer.save()
            return Response(file_serializer.data, status=status.HTTP_201_CREATED)
        else:
            return Response(file_serializer.errors, status=status.HTTP_400_BAD_REQUEST)

serializers.py

from rest_framework import serializers
from .models import MyFile


class MyFileSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyFile
        fields = ('file', 'description', 'uploaded_at')
SDRJ
  • 532
  • 3
  • 11
  • Thanks for the help, I'm sending my code, could you check? – Botta Feb 10 '21 at 16:33
  • @Botta- Yes it looks fine to me. class Meta: model = MyFile fields = ("Id","Name","Age","Profile",) Make sure the fields are also in your model. The serializer is essentially going to serialize your data to the data in the model. – SDRJ Feb 10 '21 at 20:22
  • @ Stacy I would like to import my CSV data automatically when uploading the file. I am sending the updated code. Thanks again. – Botta Feb 10 '21 at 21:34
  • Why is everyone answering that you need to add models to support file uploads? That's ridiculous. You should be able to just read the file and throw it away after you're done with it. – AlxVallejo May 10 '23 at 17:47
0

@Stacy Hi. I made the changes, but it didn't work. I would like the fields in the CSV file to go automatically to my models and to the REST API. I would like to import my CSV data when uploading the file. Thanks.

models.py

from django.db import models


class MyFile(models.Model):
   file = models.FileField(blank=False, null=False,upload_to='images/')
   description = models.CharField(null=True,max_length=255)
   uploaded_at = models.DateTimeField(auto_now_add=True)
   name = models.CharField(max_length=150)
   sex = models.CharField(max_length=150)
   age = models.CharField(max_length=50)
   height = models.CharField(max_length=150)

   def __str__(self):
    return self.description

   class Meta:
     verbose_name_plural = 'MyFiles'

serializers.py

from rest_framework import serializers
from .models import MyFile


class MyFileSerializer(serializers.ModelSerializer):
 class Meta:
    model = MyFile
    fields = ("file", "description", "uploaded_at", "name", "sex", "age", "height",)
Botta
  • 43
  • 2
  • 6
-1

@Stacy- Hello. I was able to upload the csv file and pass it to my API as .CSV, however, I would like all fields in my CSV file to be transferred to API Rest. For example ID, Name, Age and Profile. It's possible? Thank you. Thank you.

serializers.py

from rest_framework import serializers
from .models import MyFile


class MyFileSerializer(serializers.ModelSerializer):
 class Meta:
    model = MyFile
    fields = ('file', 'description', 'uploaded_at')

models.py

from django.db import models


class MyFile(models.Model):
 file = models.FileField(blank=False, null=False,upload_to='images/')
 description = models.CharField(null=True,max_length=255)
 uploaded_at = models.DateTimeField(auto_now_add=True)

def __str__(self):
    return self.description

class Meta:
    verbose_name_plural = 'MyFiles'

views.py

from rest_framework.parsers import MultiPartParser, FormParser

from .models import MyFile
from .serializers import MyFileSerializer

from rest_framework import generics
from rest_framework import viewsets
from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.exceptions import NotFound
from rest_framework.response import Response
from rest_framework.views import APIView


class MyFileViewSet(viewsets.ModelViewSet):
 queryset = MyFile.objects.all()
 serializer_class = MyFileSerializer

urls.py

from .views import MyFileViewSet

from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register(r'', MyFileViewSet)
urlpatterns = router.urls
Botta
  • 43
  • 2
  • 6