如何从Django Rest Framework FileField对象返回实际的文件数据,而不是文件URL



我正在尝试构建一个简单的API,将XML文件数据返回到客户端。我使用的是Django 3.0.4和Django Rest Framework 3.11.0,我的大部分工作都基于本教程https://www.django-rest-framework.org/tutorial/1-serialization/

这是我的型号:

从django.db导入型号

class File(models.Model):
file = models.FileField(blank=False, null=False)
device = models.CharField(max_length=20, primary_key=True)
class Meta:
verbose_name_plural = "API"
def __str__(self):
return self.file.name

这是观点:

from django.shortcuts import render
from rest_framework.parsers import FileUploadParser
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import status
from .serializers import FileSerializer
from .models import File
class FileList(APIView):
"""
List all files, or create a new file.
"""
def post(self, request, format=None):
serializer = FileSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def get(self, request, format=None):
files = File.objects.all()
serializer = FileSerializer(files, many=True)
return Response(serializer.data)
class FileDetail(APIView):
"""
Retrieve, update or delete a file instance.
"""
def get(self, request, pk, format=None):
file = File.objects.get(pk=pk)
serializer = FileSerializer(file)
return Response(serializer.data)

这是应用程序URL:

from django.urls import path
from .views import FileList
from .views import FileDetail
from django.conf.urls.static import static
from django.conf import settings
urlpatterns = [
path('<str:pk>', FileDetail.as_view()),
path('', FileList.as_view()),
]
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

我在SETTING:中有这个

STATIC_URL = '/static/'
MEDIA_URL = '/path/to/file:devices/'
MEDIA_ROOT = os.path.join(BASE_DIR, "path/to/file:devices")

一切都很好,我没有看到任何错误。我可以使用Postman来POST文件和GET文件(可以是列表,也可以是单个文件,基于pk(。我遇到的问题是,当我得到一个单独的文件时,我得到的是:

{
"file": "/path/to/file:devices/example.xml",
"device": "example.xml"
}

我希望响应是文件内容(实际的XML数据(,而不是文件的URL。任何想法都将不胜感激。

好。这是我自己想出来的。真的很简单。

我所要做的就是将GET重定向到文件结构中实际文件存储的URL。

这是新的FileDetail类视图:

class FileDetail(APIView):
"""
Get or delete a file instance.
"""
def get(self, request, pk, format=None):
print("hitting detail get")
response = redirect(os.path.join(settings.MEDIA_URL, (pk +'.xml')))
return response

最新更新