You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于类的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 23:05:25