【问题标题】:How to return actual file data instead of file URL from Django Rest Framework FileField object如何从 Django Rest Framework FileField 对象返回实际文件数据而不是文件 URL
【发布时间】:2020-03-25 18:54:37
【问题描述】:

我正在尝试构建一个将 XML 文件数据返回给客户端的简单 API。我正在使用 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)

这是应用网址:

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)

我在设置中有这个:

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

一切正常,我没有看到任何错误。我可以使用 Postman 发布文件和获取文件(作为列表或作为单个文件,基于 pk)。 我遇到的问题是,当我获取一个单独的文件时,我得到了这个:

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

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

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    好的。我自己想通了。真的很简单。

    我所要做的就是将 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
    

    【讨论】:

      猜你喜欢
      • 2017-02-02
      • 1970-01-01
      • 1970-01-01
      • 2014-07-18
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 2022-01-11
      • 2021-08-11
      相关资源
      最近更新 更多