在前面的DRF系列教程中,我们以博客为例介绍了序列化器(Serializer), 并使用基于类的视图APIView和ModelViewSet开发了针对文章资源进行增删查改的完整API端点,并详细对权限、认证(含jwt认证)和分页进行了总结与演示。在本篇文章中我们将向你演示如何在Django REST Framework中对分页结果进行进一步过滤和排序。
前面教程中当你发送GET请求到/v1/articles?page=2时可以得到下面返回的分页数据列表。现在我们希望对结果进行进一步过滤,比如返回标题含有关键词django的文章资源列表。我们到底该怎么做呢? 本例中小编我将演示三种方法, 你可以根据实际项目开发需求去使用。
方法一:重写GenericsAPIView或viewset的get_queryset方法
此方法不依赖于任何第三方包, 只适合于需要过滤的字段比较少的模型。比如这里我们需要对文章title进行过滤,我们只需要修改ArticleList视图函数类即可。
# blog/views.py
from rest_framework import generics
from rest_framework import permissions
from .permissions import IsOwnerOrReadOnly
from .pagination import MyPageNumberPagination
class ArticleList(generics.ListCreateAPIView):
serializer_class = ArticleSerializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
pagination_class = MyPageNumberPagination
def get_queryset(self):
keyword = self.request.query_params.get('q')
if not keyword:
queryset = Article.objects.all()
else:
queryset = Article.objects.filter(title__icontains=keyword)
return queryset
# associate user with article author.
def perform_create(self, serializer):
serializer.save(author=self.request.user)
修改好视图类后,发送GET请求到/v1/articles?page=2&q=django, 你将得到所有标题含有django关键词的文章列表,这里显示一共有3条结果。
当一个模型需要过滤的字段很多且