【问题标题】:Django sort on paginated resultsDjango对分页结果进行排序
【发布时间】:2018-07-19 15:59:54
【问题描述】:

我正在使用 CBV 在 Django 2 中创建一个列表视图。分页正在工作,但是我现在正在尝试将排序添加到我的分页中。这种排序将起作用,当用户选择一列时,它将附加一个 GET 查询字符串,然后当我呈现我的视图时,我将 order_by QueryResult。

这是可行的,但是我现在只获取 4 个条目(我的当前页面),而不是整个集合。我的问题是我需要它只过滤当前页面结果,然后返回当前页面和其余结果。

这是我目前的解决方案:

class AccountList(ListView):
    ordering_dict = {
        'pk':'asc', 'is_active':'asc','created':'asc'
        }
    template_name = "marketing/comm_list.html"
    context_object_name = 'comms'
    paginate_by = 4

    def get_queryset(self):
        type_filter = self.request.GET.get('type', 'all')

        queryset = Comm.objects.values('pk', 'name', 'is_active', 'created')

        page_field = self.request.GET.get('page')
        paginator = Paginator(queryset, 4)

        try:
            pages = paginator.page(page_field)
        except PageNotAnInteger:
            pages = paginator.page(1)
        except EmptyPage:
            pages = paginator.page(paginator.num_pages)

        start_index = pages.start_index()
        end_index = pages.end_index()

        queryset = Comm.objects.values('pk', 'name', 'is_active', 'created').filter(pk__gte=start_index, pk__lte=end_index)

        order_by_field = self.request.GET.get('order_by')
        if order_by_field:
            if self.ordering_dict[order_by_field] == 'asc':
                self.ordering_dict[order_by_field] = 'desc'
            else:
                self.ordering_dict[order_by_field] = 'asc'
                order_by_field = '-'+order_by_field    
            queryset = queryset.order_by(order_by_field)
        else:
            queryset = queryset.order_by('-created') 
        return queryset

感谢任何帮助,我正在使用 Django 2 和 Python 3.6。谢谢!

一般问题是我希望能够仅在分页结果的当前页面上按列排序

【问题讨论】:

  • 你需要在客户端解决这个问题,而不是在服务器端。使用对列进行客户端排序的数据表小部件;它只会对页面上显示的内容进行排序。

标签: python django pagination


【解决方案1】:

您可以使用它进行排序:

return sorted(queryset, key=lambda k: k.column_name])

这将在queryset 上进行迭代并按column_name 对其进行排序。

您也可以检查k['column_name'] 而不是k.column_name,看看哪个适合您。

更多关于python here中的sorted函数的信息。

【讨论】:

  • 这听起来可以,但是我只想在当前页面上排序,如果我不拆分页面结果的话。它对整个数据库进行排序,我只想对当前页面(不是每个条目)进行排序。这可能吗?
  • 也在尝试: order_by_field = self.request.GET.get('order_by') return sorted(queryset, key=lambda k: k[order_by_field]) 我得到一个 key_error 但是我有我的 order_by查询字符串设置为 ?order_by= is_active
【解决方案2】:

您可以在模型中添加打击类,以按照您给定的顺序返回查询结果

Class Meta:
    ordeing = ('col_name') # in order
    ordeing = ('-col_name') # in reverse

另一种方法是为您的模型创建一个管理器类。创建一个函数来返回你需要的任何东西,然后在你需要的地方调用它。

class MyModelManager(models.Manager):
    def get_my_query(self, order):
         #Write your query

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-12
    • 2019-07-11
    • 2013-04-28
    • 1970-01-01
    • 2021-08-19
    • 2013-05-04
    • 1970-01-01
    相关资源
    最近更新 更多