Django对分页结果进行排序

时间:2018-07-14 14:03:11

标签: python django pagination

我正在使用CBV在Django 2中创建一个列表视图。分页正在运行,但是我现在正在尝试对分页进行排序。这种排序将起作用,即当用户选择列时,它将附加一个GET查询字符串,然后在渲染视图时,将对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。谢谢!

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

2 个答案:

答案 0 :(得分:0)

您可以使用它进行排序:

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

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

您也可以选中k['column_name']而不是k.column_name,然后看看哪一个适合您。

有关Python heresorted函数的更多信息。

答案 1 :(得分:0)

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

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