Django REST框架的ModelViewSet是一个提供CRUD操作的视图集,它结合了ListModelMixin、RetrieveModelMixin、CreateModelMixin、UpdateModelMixin和DestroyModelMixin的功能。默认情况下,GET请求可以不带任何过滤器参数,返回所有或单个资源。
强制GET请求包含过滤器的常见原因包括:
from rest_framework import viewsets
from rest_framework.exceptions import ValidationError
class MyModelViewSet(viewsets.ModelViewSet):
def get_queryset(self):
if self.request.method == 'GET' and not self.request.query_params:
raise ValidationError("Filter parameters are required for GET requests")
return super().get_queryset()
from rest_framework import filters
class RequiredFilterBackend(filters.BaseFilterBackend):
def filter_queryset(self, request, queryset, view):
if request.method == 'GET' and not request.query_params:
raise ValidationError("At least one filter parameter is required")
return queryset
class MyModelViewSet(viewsets.ModelViewSet):
filter_backends = [RequiredFilterBackend, filters.SearchFilter]
# 其他配置...
from rest_framework.permissions import BasePermission
class FilterRequiredPermission(BasePermission):
def has_permission(self, request, view):
if request.method == 'GET' and not request.query_params:
return False
return True
class MyModelViewSet(viewsets.ModelViewSet):
permission_classes = [FilterRequiredPermission]
# 其他配置...
from rest_framework import viewsets, filters
from rest_framework.exceptions import ValidationError
from django_filters import rest_framework as django_filters
from myapp.models import MyModel
from myapp.serializers import MyModelSerializer
class MyModelFilter(django_filters.FilterSet):
class Meta:
model = MyModel
fields = ['field1', 'field2', 'field3__contains']
class FilterRequiredMixin:
def get_queryset(self):
if self.request.method == 'GET' and not self.request.query_params:
raise ValidationError({
"detail": "Filter parameters are required for list requests. Available filters: field1, field2, field3__contains"
})
return super().get_queryset()
class MyModelViewSet(FilterRequiredMixin, viewsets.ModelViewSet):
queryset = MyModel.objects.all()
serializer_class = MyModelSerializer
filter_backends = [django_filters.DjangoFilterBackend, filters.SearchFilter]
filterset_class = MyModelFilter
search_fields = ['field1', 'field2']
通过以上方法,你可以有效地强制GET请求必须包含过滤器参数,从而提高API的安全性和性能。
没有搜到相关的文章