简体   繁体   English

如何使用 Django Rest Framework 在单个请求中反序列化多个文件和表单数据?

[英]How can I deserialize multiple files and form data in a single request using Django Rest Framework?

I would like to desearialize a form with some basic form data + one or more uploaded files.我想用一些基本的表单数据 + 一个或多个上传的文件去序列化一个表单。

If I send the following request (generated as Python Requests code using Postman)如果我发送以下请求(使用 Postman 生成为 Python 请求代码)

import requests

url = "http://127.0.0.1:8000/forms/test/"

payload = {
'customer_id': '123456789',
'customer_name': 'Billy Bob'}
files = [
  ('files', open('/C:/tmp/aaaaa.csv','rb')),
  ('files', open('/C:/tmp/bbbbb.csv','rb'))
]
headers= {}

response = requests.request("POST", url, headers=headers, data = payload, files = files)

print(response.text.encode('utf8'))

The code returns the following response (I hoped it would save the file instead).代码返回以下响应(我希望它会保存文件)。

{
    "files": [
        "This field is required."
    ]
}

Models楷模

from datetime import datetime
from django.db import models

class Mtfar(models.Model):
    date = models.DateTimeField(auto_now_add=True)
    customer_id = models.IntegerField()
    customer_name = models.CharField(max_length=254)

class MtfarFile(models.Model):
    file = models.FileField(blank=False, null=False)
    mtfar = models.ForeignKey(Mtfar, related_name='files', on_delete=models.CASCADE)

Serializers序列化器

from rest_framework import serializers
from .models import Mtfar, MtfarFile

class MtfarFileSerializer(serializers.ModelSerializer):
    class Meta:
        model = MtfarFile
        fields = ['file']

class MtfarSerializer(serializers.ModelSerializer):

    files = MtfarFileSerializer(many=True)

    class Meta:
        model = Mtfar
        fields = ['customer_ptid', 'customer_name', 'files']

View看法

from rest_framework.parsers import MultiPartParser, FormParser
from rest_framework.decorators import api_view, parser_classes
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import status

from .serializers import MtfarSerializer, MtfarFileSerializer

@api_view(['POST'])
@parser_classes([MultiPartParser])
def post_generic_form(request):

    data = request.data
    
    filelist = []
    for f in request.FILES.getlist('files'):
        filelist.append({
            'file': f
        })
    data.setlist('files', filelist)

    serializer = MtfarSerializer(data=data)

    if serializer.is_valid():
        serializer.save()
        return Response(status=status.HTTP_201_CREATED)
    else:
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

You need to convert the QueryDict object into a dict to support nested serialization , because DRF parsing the QueryDict in a different way.您需要将QueryDict对象转换为dict以支持嵌套序列化,因为 DRF 以不同的方式解析QueryDict (Ref: get_value(self, dictionary) method -- (DRF source code) ) (参考: get_value(self, dictionary)方法——(DRF 源代码)

@api_view(['POST'])
@parser_classes([MultiPartParser])
def post_generic_form(request):
    dict_data = { **request.data.dict(), **{"files": [{"file": file} for file in request.FILES.getlist('files')]} }
    serializer = MtfarSerializer(data=dict_data)

    if serializer.is_valid():
        serializer.save()
        return Response(status=status.HTTP_201_CREATED)
    else:
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何在django rest框架中反序列化多个对象的列表? - How do I deserialize list of multiple objects in django rest framework? 如何使用Django Rest框架解析多部分表单数据中的多个文件? - How to parse multiple files in multipart form-data with django rest framework? 如何在 django REST 框架中修改 request.data - How can modify request.data in django REST framework 如何使用django-rest-framework反序列化嵌套的相关JSON数据? - How to deserialize nested related JSON Data with django-rest-framework? 如何在 django rest 框架中上传多个文件 - How to upload multiple files in django rest framework 如何使用 django rest 框架添加每个学生的多个图像 - how can I add multiple images of each student using django rest framework 在Django Rest Framework中,如何使用TemplateHTMLRenderer查看分页数据? - In Django Rest Framework, how can I view paginated data with TemplateHTMLRenderer? 如何使用Django Rest Framework反序列化嵌套序列化程序 - How to deserialize nested serializers with Django Rest Framework Django Rest Framework:在多部分/表单数据请求中序列化数组 - Django Rest Framework: Serialize an Array in a multipart/form-data request 在保存到REST Framework中之前如何进行反序列化 - How can i deserialize before saving in REST Framework
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM