【问题标题】:How to upload a CSV file in Django using the REST API?如何使用 REST API 在 Django 中上传 CSV 文件?
【发布时间】:2021-02-09 22:30:35
【问题描述】:

如何使用 Rest Framework API 将 220,000 行的 CSV 文件发送到 Django?谢谢。

【问题讨论】:

标签: django api rest


【解决方案1】:

@Botta- 这样的事情怎么样 从 django.db 导入模型

在这里创建您的模型。

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)

序列化器.py

from rest_framework import serializers
from .models import MyFile


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

【讨论】:

  • 感谢您的帮助,我正在发送我的代码,您能检查一下吗?
  • @Botta- 是的,我觉得很好。 class Meta: model = MyFile fields = ("Id","Name","Age","Profile",) 确保这些字段也在您的模型中。序列化器本质上是将你的数据序列化为模型中的数据。
  • @Stacy 我想在上传文件时自动导入我的 CSV 数据。我正在发送更新的代码。再次感谢。
【解决方案2】:

@Stacy- 你好。我能够上传 csv 文件并将其作为 .CSV 传递给我的 API,但是,我希望将 CSV 文件中的所有字段都传输到 API Rest。例如 ID、姓名、年龄和个人资料。这是可能的?谢谢你。谢谢。

序列化器.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

【讨论】:

    【解决方案3】:

    @Stacy 嗨。我进行了更改,但没有成功。我希望 CSV 文件中的字段自动转到我的模型和 REST API。我想在上传文件时导入我的 CSV 数据。谢谢。

    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'
    

    序列化器.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",)
    

    【讨论】:

      猜你喜欢
      • 2014-08-16
      • 1970-01-01
      • 1970-01-01
      • 2020-05-22
      • 2019-01-17
      • 2018-06-08
      • 1970-01-01
      • 2023-01-31
      • 1970-01-01
      相关资源
      最近更新 更多