如何在Django Rest Framework中添加后缀url



如何在ModelViewSet中添加后缀url

序列化程序

class CommentSerializer(serializers.ModelSerializer):
class Meta:
model = Comment
fields = '__all__'
def update(self, instance, validated_data):
...
...

ModelViewSet

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

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,
...
...
})

Urls

router = routers.DefaultRouter()
router.register(
"comments",
CommentViewSet
)
urlpatterns = [
path('api/v1/', include(router.urls))
]

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

网址:http://localhost:8000/api/v1/comments/{id}

我想做一些类似的事情

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

您想要做的并没有遵循REST体系结构和流行的实践。在REST中,每个端点代表一个资源。资源上的操作由HTTP方法表示。因此,如果您可以通过这个URLhttp://localhost:8000/api/v1/comments/访问注释资源,那么您可以创建(POST(,在列表端点上获取列表(get(并编辑(PUT和PATCH(,获取单个注释(get(,然后使用详细信息端点删除(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-行动

只更改视图中需要的内容并添加此操作装饰器。

在您的视野中.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)

最新更新