Django CursorPagination用于按几个字段排序

问题描述 投票:0回答:1

我正在使用Django DRF的CursorPagination来延迟加载我的数据,目前我的目标是按多个字段对数据进行排序。

这就是我的代码现在的样子:

class EndlessPagination(CursorPagination):

    ordering_param = ''

    def set_ordering_param(self, request):
        self.ordering = request.query_params.get(self.ordering_param, None)

        if not self.ordering:
            raise ValueError('Url must contain a parameter named ' + 
                             self.ordering_param)
        if self.ordering.startswith("\"") or self.ordering.endswith("\""):
            raise ValueError('Ordering parameter should not include quotation marks'    

    def paginate_queryset(self, queryset, request, view=None):
        # This function is designed to set sorting param right in the URL
        self.set_ordering_param(request)
        return super(EndlessPagination, self).paginate_queryset(queryset, request, view)

这个代码适用于像my_url/sms/270380?order_by=-timestamp这样的网址,但如果我想按几个字段排序呢?

python django django-rest-framework
1个回答
2
投票

使用str.split()分割url params

class EndlessPagination(CursorPagination):
    ordering_param = 'order_by'

    def set_ordering_param(self, request):
        ordering_param_list = request.query_params.get(self.ordering_param, None)

        self.ordering = ordering_param_list.split(',')

        # here, "self.ordering" will be a "list", so, you should update the validation logic
        """
        if not self.ordering:
            raise ValueError('Url must contain a parameter named ' +
                             self.ordering_param)
        if self.ordering.startswith("\"") or self.ordering.endswith("\""):
            raise ValueError('Ordering parameter should not include quotation marks'
        """

    def paginate_queryset(self, queryset, request, view=None):
        # This function is designed to set sorting param right in the URL
        self.set_ordering_param(request)
        return super(EndlessPagination, self).paginate_queryset(queryset, request, view)

示例网址 1. my_url/sms/270380?order_by=-timestamp 2. my_url/sms/270380?order_by=-timestamp,name 3. my_url/sms/270380?order_by=-name,foo,-bar


UPDATE-1

首先感谢你给我一个深挖的机会:) 正如你所说,我也没有在流行的API中看到逗号分隔的query_params。所以,将url格式更改为,

my_url/sms/270380??order_by=-name&order_by=foo&order_by=-bar
At this time, the request.query_params['order_by'] will be a list equal to ['-name','foo','-bar']. So, you don't want to use the split() function, hence your set_ordering_param() method become,
def set_ordering_param(self, request):
    self.ordering = request.query_params.get(self.ordering_param, None)
    #...... your other validations
© www.soinside.com 2019 - 2024. All rights reserved.