如何在Django Rest框架中添加后缀url?

2024-09-26 18:13:31 发布

您现在位置:Python中文网/ 问答频道 /正文

如何在ModelViewSet中添加后缀url

序列化程序

class CommentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Comment
        fields = '__all__'

    def update(self, instance, validated_data):
        ...
        ...

模型视图集

我正在做一个自定义的部分更新

class CommentViewSet(viewsets.ModelViewSet):
    queryset = Comment.objects.all()
    serializer_class = CommentSerializer
    http_method_names = ['get', 'patch', 'head', 'options']

    def partial_update(self, request, *args, **kwargs):
        super(CommentViewSet, self).partial_update(
            request, *args, **kwargs)

        return Response({
            "data": request.data,
            ...
            ...
        })

网址

router = routers.DefaultRouter()
router.register(
    "comments",
    CommentViewSet
)

urlpatterns = [
    path('api/v1/', include(router.urls))
]

目前有这个,但我想添加一个后缀

url:http://localhost:8000/api/v1/comments/{id}

我想做这样的事情

url:http://localhost:8000/api/v1/comments/{id}/update_or_whatever


Tags: selfapihttpurldatarequestupdatecomments
2条回答

您想要做的并不是遵循REST体系结构和流行实践。在REST中,每个端点表示一个资源。资源上的操作由HTTP方法表示。因此,如果您可以通过这个url http://localhost:8000/api/v1/comments/访问comments资源,那么您可以创建(POST)、获取列表端点上的列表(get)并编辑(PUT和PATCH)、获取单个注释(get)并使用detail端点删除(delete)。这样,您就不需要根据像http://localhost:8000/api/v1/comments/{id}/update这样的操作显式地命名URL。这就是DRF所基于的体系结构,也是您拥有这种url样式的原因。当然,有些操作(如登录等)可能不适合此体系结构,这就是DRF提供自定义操作的原因。但是您不应该使用它来覆盖映射到HTTP方法的默认操作

来自DFR的另一个魔力

https://www.django-rest-framework.org/api-guide/viewsets/#viewset-actions

只需在视图中更改所需内容并添加此动作装饰器

在您的视图中.py

    @action(methods=['get'], detail=True, permission_classes=[IsAuthenticated])
    def get_file(self, request, pk=None):
        if pk is None:
            raise ValueError("Found empty filename")
        obj = self.get_queryset().filter(pk=pk).first()
        if obj and obj.image_file:
            return FileResponse(obj.image_file, content_type="image/jpeg")

        return Response(
                'Nothing to show',
                status=status.HTTP_400_BAD_REQUEST)

相关问题 更多 >

    热门问题