对于列表数据可能需要根据字段进行过滤,我们可以通过添加django-fitlter扩展来增强支持。
| pip install django-filter |
在配置文件中增加过滤后端的设置:
| INSTALLED_APPS = [ |
| ... |
| 'django_filters', |
| ] |
| |
| REST_FRAMEWORK = { |
| ... |
| 'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',) |
| } |
在视图中添加filter_fields属性,指定可以过滤的字段
| class BookListView(ListAPIView): |
| queryset = BookInfo.objects.all() |
| serializer_class = BookInfoSerializer |
| filter_fields = ('btitle', 'bread') |
| |
| |
对于列表数据,REST framework提供了OrderingFilter过滤器来帮助我们快速指明数据按照指定字段进行排序。
在类视图中设置filter_backends,使用rest_framework.filters.OrderingFilter
过滤器,REST framework会在请求的查询字符串参数中检查是否包含了ordering参数,如果包含了ordering参数,则按照ordering参数指明的排序字段对数据集进行排序。
前端可以传递的ordering参数的可选字段值需要在ordering_fields中指明。
示例:
| class BookListView(ListAPIView): |
| queryset = BookInfo.objects.all() |
| serializer_class = BookInfoSerializer |
| filter_backends = [OrderingFilter] |
| ordering_fields = ('id', 'bread', 'bpub_date') |
| |
| |
REST framework提供了分页的支持。
我们可以在配置文件中设置全局的分页方式,如:
| REST_FRAMEWORK = { |
| 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', |
| 'PAGE_SIZE': 100 |
| } |
也可通过自定义Pagination类,来为视图添加不同分页行为。在视图中通过pagination_clas
属性来指明。
| class LargeResultsSetPagination(PageNumberPagination): |
| page_size = 1000 |
| page_size_query_param = 'page_size' |
| max_page_size = 10000 |
| class BookDetailView(RetrieveAPIView): |
| queryset = BookInfo.objects.all() |
| serializer_class = BookInfoSerializer |
| pagination_class = LargeResultsSetPagination |
注意:如果在视图内关闭分页功能,只需在视图内设置
1) PageNumberPagination
前端访问网址形式:
| GET http://api.example.org/books/?page=4 |
可以在子类中定义的属性:
- page_size 每页数目
- page_query_param 前端发送的页数关键字名,默认为"page"
- page_size_query_param 前端发送的每页数目关键字名,默认为None
- max_page_size 前端最多能设置的每页数量
| from rest_framework.pagination import PageNumberPagination |
| |
| class StandardPageNumberPagination(PageNumberPagination): |
| page_size_query_param = 'page_size' |
| max_page_size = 10 |
| |
| class BookListView(ListAPIView): |
| queryset = BookInfo.objects.all().order_by('id') |
| serializer_class = BookInfoSerializer |
| pagination_class = StandardPageNumberPagination |
| |
| |
2)LimitOffsetPagination
前端访问网址形式:
| GET http://api.example.org/books/?limit=100&offset=400 |
可以在子类中定义的属性:
- default_limit 默认限制,默认值与
PAGE_SIZE
设置一直
- limit_query_param limit参数名,默认’limit’
- offset_query_param offset参数名,默认’offset’
- max_limit 最大limit限制,默认None
| from rest_framework.pagination import LimitOffsetPagination |
| |
| class BookListView(ListAPIView): |
| queryset = BookInfo.objects.all().order_by('id') |
| serializer_class = BookInfoSerializer |
| pagination_class = LimitOffsetPagination |
| |
| |