Django Rest Framework - Import CSV( " No file was submitted " )



我正在尝试使用序列化程序在 Django Rest Framework 中上传 CSV 文件。

下面提供了包含模型、视图和序列化程序代码的图像,以及我尝试提交 CSV 文件时的控制台输出。

在验证序列化程序之前,当我使用 print(serializer.initial_data) 检查序列化程序时,序列化程序内部有一个文件,但是一旦序列化程序进行验证,它就会说没有提交任何文件。

models.py

class InventoryFile(models.Model):
    shop           = models.ForeignKey(Shop,on_delete=models.CASCADE)
    shop_inventory = models.FileField(upload_to='inventory/')

serializers.py

class InventoryFile_Serializer(serializers.ModelSerializer):
    class Meta:
        model = InventoryFile
        fields = ('shop_inventory',)

views.py

class InvertoryUpload(APIView):
    serializer_class = InventoryFile_Serializer
    parser_classes = [ MultiPartParser,FormParser ]
    def post(self,request):
        try:
            serializer = InventoryFile_Serializer(data=request.data)
            print(serializer.initial_data)
            if serializer.is_valid():
                print(serializer.data)
                return Response("Done")
            else:
                print(serializer.errors)
                return Response("Not Done")
        except Exception as e:
            return Response(str(e))  

输出

System check identified no issues (0 silenced).
January 30, 2019 - 11:22:06
Django version 2.1, using settings 'hoplet.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
<QueryDict: {'inventory': [<InMemoryUploadedFile: MOCK_DATA_2.csv (application/vnd.ms-excel)>]}>
{'shop_inventory': [ErrorDetail(string='No file was submitted.', code='required')]}
[30/Jan/2019 11:22:18] "POST /uploadinv HTTP/1.1" 200 10
请求

中的文件的键名是inventory,序列化程序要查找的键名is shop_inventory 。它们应该是相同的。更改其中之一,它应该可以工作。

Please try in this way        
urls.py
              urlpatterns = [
            url(r'^', include(router.urls)),
            url(r'^upload_file', InvertoryUpload.as_view())
        ]
        models.py
        class InventoryFile(models.Model):
            shop = models.ForeignKey(Shop,on_delete=models.CASCADE)
            shop_inventory = models.FileField(upload_to='inventory/')

        views.py
        from rest_framework.parsers import MultiPartParser, FormParser
        from rest_framework.generics import CreateAPIView
        class InvertoryUpload(CreateAPIView):
            serializer_class = InventoryFile_Serializer
            parser_classes = [ MultiPartParser, FormParser ]
        serializers.py
        class InventoryFile_Serializer(serializers.ModelSerializer):
            class Meta:
                model = InventoryFile
                fields = ('shop_inventory','shop')

最新更新