Django REST Framework (DRF) 的 FileField 在泛型视图和 APIView 中的行为不同

问题描述 投票:0回答:1

我想在 django 中处理文件上传。

模型和序列化器如下:

def save_file(instance, filename):
    _, ext = os.path.splitext(filename)
    return f"{instance.id}{ext}"

class FileModel(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    title = models.CharField(max_length=64)
    file = models.FileField(upload_to=save_file)
    created = models.DateTimeField(auto_now_add=True)


class FileModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = FileModel
        fields = "__all__"

当我使用这样的泛型视图时:

class FileListApi(generics.ListAPIView):
    queryset = FileModel.objects.all()
    serializer_class = FileModelSerializer

API会是这样的,url是绝对路径:

[
  {
    "id": "2c5488ec-7b5d-45ab-9c43-058c19d76626",
    "title": "file.png",
    "file": "http://127.0.0.1:8000/media/2c5488ec-7b5d-45ab-9c43-058c19d76626.png",
    "created": "2024-02-07T02:29:29.845808Z"
  }
]

但是当我使用 APIView 时:

class FileListApi(APIView):
    def get(self, request):
        serializer = FileModelSerializer(FileModel.objects.all(), many=True)
        return Response(serializer.data)

网址现在是相对路径:

[
  {
    "id": "2c5488ec-7b5d-45ab-9c43-058c19d76626",
    "title": "file.png",
    "file": "/media/2c5488ec-7b5d-45ab-9c43-058c19d76626.png",
    "created": "2024-02-07T02:29:29.845808Z"
  }
]

我可以想象有些情况需要绝对路径或相对路径,在我的特殊情况下我想使用相对路径。

为什么 DRF 在泛型视图和 APIView 中表现不同?

如何使 DRF 输出 url 不同?

python django django-rest-framework
1个回答
0
投票

我在这篇post中找到了解决方案。

解决方案

如果您确实想使用相对 URL,则应该在序列化器上下文中显式传递

{'request': None}

class FileListApi(generics.ListAPIView):
    queryset = FileModel.objects.all()
    serializer_class = FileModelSerializer

    def get_serializer_context(self):
        result = super().get_serializer_context()
        result['request'] = None
        return result
© www.soinside.com 2019 - 2024. All rights reserved.