下面给出的是用 ListAPIview 编写的代码,现在我必须将其更改为 APIView。如何在其中进行搜索、过滤和排序?如果需要更多详细信息,请在评论中告诉我。提前致谢。
class DiscussionView(APIView):
pagination_class = DiscussionPagination
filter_backends = [OrderingFilter, SearchFilter]
search_fields = ['title']
ordering_fields = ['id']
def get(self, request, format=None):
query = Discussion.objects.all()
serializer = DiscussionSerializer(query, many=True)
return Response(serializer.data)
def post(self, request, format=None):
serializer = DiscussionSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
而不是使用APIView
您应该使用GenericAPIView
DRF 文档,那么您可以简单地使用filter_queryset
视图的方法,该方法将使用指定的filter_backends
来过滤查询集。要分页,您可以使用该paginate_queryset
方法并get_paginated_response
返回分页响应:
from rest_framework.generics import GenericAPIView
class DiscussionView(GenericAPIView):
pagination_class = DiscussionPagination
filter_backends = [OrderingFilter, SearchFilter]
search_fields = ['title']
ordering_fields = ['id']
def get(self, request, format=None):
query = self.filter_queryset(Discussion.objects.all()) # Here
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = DiscussionSerializer(query, many=True)
return Response(serializer.data)
def post(self, request, format=None):
serializer = DiscussionSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句