要使用Django过滤器并对过滤后的结果进行分页,你可以执行以下操作:
- 为你的模型创建一个过滤器类:
开
my_project/my_app/filters.py:
import django_filtersclass MyModelFilter(django_filters.FilterSet): class meta: model = MyModel # Declare all your model fields by which you will filter # your queryset here: fields = ['field_1', 'field_2', ...]
每个
FilterSet
对象都有一个.qs
包含过滤查询集的属性,如果需要,你甚至可以覆盖它。我们将对我们的
.qs
财产进行分页MyModelFilter
:
开
my_project/my_app/views.py:
from . import filtersfrom django.core.paginator import Paginator, EmptyPage, PageNotAnIntegerdef my_view(request): # BTW you do not need .all() after a .filter() # local_url.objects.filter(global_url__id=1) will do filtered_qs = filters.MyModelFilter(request.GET, queryset=MyModel.objects.all() ).qs paginator = Paginator(filtered_qs, YOUR_PAGE_SIZE) page = request.GET.get('page') try: response = paginator.page(page) except PageNotAnInteger: response = paginator.page(1) except EmptyPage: response = paginator.page(paginator.num_pages) return render( request, 'your_template.html', {'response': response} )在那里,你拥有了!
PS_1:根据我的经验,使用Django过滤器时,使用Django Rest framework可以更好地“玩”。
PS_2:如果你要使用DRF,我已经写了一个示例,说明如何在基于函数的视图中使用分页,可以轻松地将其与结合使用
FilterSet:
@api_view(['GET',])def my_function_based_list_view(request): paginator = PageNumberPagination() filtered_set = filters.MyModelFilter( request.GET, queryset=MyModel.objects.all() ).qs context = paginator.paginate_queryset(filtered_set, request) serializer = MyModelSerializer(context, many=True) return paginator.get_paginated_response(serializer.data)



