我的观点很好
class PlayerViewSet(ModelViewSet):
queryset = Player.objects.all()
serializer_class = PlayerSerializer
filter_backends = [SearchFilter]
search_fields = ['nickname']
网址配置:
path('player', PlayerViewSet.as_view({'get': 'list', 'post': 'create'})),
当我尝试使用诸如“ player?search = randomNickname”的端点搜索对象时,一切正常
但是可以发送不带搜索参数的GET请求,并且它返回所有可能的对象
有什么方法可以根据需要设置搜索字段?
由于ModelViewSet
可以执行各种操作(获取,更新,删除..),因此最好扩展SearchFilter
并使其在没有传递搜索参数或错误的情况下返回空结果。
from rest_framework import filters
from rest_framework.exceptions import ValidationError
class CustomSearchFilter(filters.SearchFilter):
def filter_queryset(self, request, queryset, view):
search_terms = self.get_search_terms(request)
if not search_terms:
# turn queryset in EmptyQuerySet
# so no objects will be returned
return queryset.none()
# Alternatively, an error can be raise
#raise ValidationError(
# "%s parameter is required!" % self.search_param
#)
return super().filter_queryset(request, queryset, view)
class PlayerViewSet(ModelViewSet):
queryset = Player.objects.all()
serializer_class = PlayerSerializer
filter_backends = [CustomSearchFilter]
search_fields = ['nickname']
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句