当前位置: 首页 > 面试题库 >

Django过滤器使用分页

江迪
2023-03-14
问题内容

我正在使用该django-filter软件包在列表视图中提供搜索功能。

现在,我还要向该视图添加分页。
我正在尝试将分页与过滤后的查询集结合起来,但是我不知道如何继续。

到目前为止,我已经尝试了以下方法views.py

def search(request):
    qs = local_url.objects.filter(global_url__id=1).all()
    paginator = Paginator(qs, 25)
    page = request.GET.get('page')
    try:
        pub = paginator.page(page)
    except PageNotAnInteger:
        pub = paginator.page(1)
    except EmptyPage:
       pub = paginator.page(paginator.num_pages)
    url_filter = PublicationFilter(request.GET, queryset=qs)
    return render(request, 'ingester/search_list.html', {'filter': url_filter, 'publication':pub})

问题答案:

要使用Django过滤器并对过滤后的结果进行分页,你可以执行以下操作:

  1. 为你的模型创建一个过滤器类:

my_project/my_app/filters.py:

import django_filters

class 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', ...]
  1. 每个FilterSet对象都有一个.qs包含过滤查询集的属性,如果需要,你甚至可以覆盖它。

  2. 我们将对我们的.qs财产进行分页MyModelFilter

my_project/my_app/views.py

from . import filters
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

def 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)


 类似资料:
  • 本文向大家介绍Django 自定义过滤器,包括了Django 自定义过滤器的使用技巧和注意事项,需要的朋友参考一下 示例 过滤器允许您将函数应用于变量。此函数可以使用0或1参数。语法如下: 过滤器可以链接在一起,因此非常有效: 如果将其翻译成python,上面的代码行将给出以下内容: 在此示例中,我们将编写一个verbose_name适用于模型(实例或类)或QuerySet的自定义过滤器。它将返回

  • 问题内容: 天是用户输入以获得比(用户输入的天数)还早的结果的数字。例如,如果用户输入32天,则他们将获得30天之前的结果。 快速试用: 我的问题和尝试 来自输入字段的输入 在我的情况下,在Django中执行此操作的最佳方法是什么? 问题答案: 这样的事情将为你工作:

  • 问题内容: 我注意到这里有内置的过滤器,但找不到。 我是Django的新手,不确定是否有这样的过滤器。 问题答案: 没有。但是,如果您是个小黑客……。 http://slacy.com/blog/2010/07/using-djangos-widthratio-template-tag-for- multiplication-division/ 计算A * B:{%widthaatio A 1 B

  • 问题内容: 我正在尝试获取最新的Django模型对象,但似乎无法成功。 这些都不起作用: 问题答案:

  • 本文向大家介绍dynamics-crm 使用过滤器过滤API查询,包括了dynamics-crm 使用过滤器过滤API查询的使用技巧和注意事项,需要的朋友参考一下 示例 您可以使用filter属性从CRM检索值的子集。在此示例中,仅返回公司名称等于CompanyName的帐户。            

  • 所有任务都实现了 Chain-of-responsibility 模式并且可以像ASP.NET MVC操作过滤器一样被拦截。 定义过滤器 public class LogEverythingAttribute : JobFilterAttribute, IClientFilter, IServerFilter, IElectStateFilter, IApplyStateFilter {