基于类的Django REST API仅实现GET方法是否可行?
实现仅支持GET方法的DRF基于类的API
完全可以实现,你当前使用的ModelViewSet默认包含了所有CRUD对应的HTTP方法(GET/POST/PUT/DELETE等),只需做简单修改即可限制为仅支持GET请求,以下是几种可行方案:
方案1:使用ReadOnlyModelViewSet
ReadOnlyModelViewSet是DRF提供的专门用于只读接口的视图集,天然只支持list(获取列表)和retrieve(获取详情)两种GET请求:
# views.py from app.models import * from app.serializers import * from rest_framework import viewsets from django_filters.rest_framework import DjangoFilterBackend class GetFooIdViewSet(viewsets.ReadOnlyModelViewSet): queryset = Foos.objects.all() serializer_class = FoosSerializer filter_backends = [DjangoFilterBackend] filterset_fields = ['foo_id']
方案2:在ModelViewSet中指定允许的HTTP方法
如果你仍想保留ModelViewSet的结构,可通过http_method_names属性直接限制允许的方法:
# views.py from app.models import * from app.serializers import * from rest_framework import viewsets from django_filters.rest_framework import DjangoFilterBackend class GetFooIdViewSet(viewsets.ModelViewSet): queryset = Foos.objects.all() serializer_class = FoosSerializer filter_backends = [DjangoFilterBackend] filterset_fields = ['foo_id'] # 仅允许GET请求 http_method_names = ['get']
方案3:组合GenericViewSet与只读Mixin
通过组合基础视图类和只读功能的Mixin,也能实现仅支持GET的接口:
# views.py from app.models import * from app.serializers import * from rest_framework import viewsets, mixins from django_filters.rest_framework import DjangoFilterBackend class GetFooIdViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet): queryset = Foos.objects.all() serializer_class = FoosSerializer filter_backends = [DjangoFilterBackend] filterset_fields = ['foo_id']
以上三种方案都能达到你要的仅支持GET方法的API效果,选择任意一种修改即可。
内容的提问来源于stack exchange,提问作者null92
相关产品推荐
相关产品推荐

