如何在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)