|
11 | 11 |
|
12 | 12 | from django.core.paginator import InvalidPage |
13 | 13 | from django.core.paginator import Paginator as DjangoPaginator |
| 14 | +from django.db.models import OrderBy |
14 | 15 | from django.template import loader |
15 | 16 | from django.utils.encoding import force_str |
16 | 17 | from django.utils.translation import gettext_lazy as _ |
@@ -615,7 +616,7 @@ def paginate_queryset(self, queryset, request, view=None): |
615 | 616 | return None |
616 | 617 |
|
617 | 618 | self.base_url = request.build_absolute_uri() |
618 | | - self.ordering = self.get_ordering() |
| 619 | + self.ordering = self.get_ordering(queryset) |
619 | 620 |
|
620 | 621 | self.cursor = self.decode_cursor(request) |
621 | 622 | if self.cursor is None: |
@@ -802,10 +803,25 @@ def get_previous_link(self): |
802 | 803 | cursor = Cursor(offset=offset, reverse=True, position=position) |
803 | 804 | return self.encode_cursor(cursor) |
804 | 805 |
|
805 | | - def get_ordering(self): |
| 806 | + def get_ordering(self, queryset): |
806 | 807 | """ |
807 | 808 | Return a tuple of strings, that may be used in an `order_by` method. |
808 | 809 | """ |
| 810 | + # Return the ordering value from the queryset if it has one. |
| 811 | + if queryset.ordered: |
| 812 | + ordering = [] |
| 813 | + |
| 814 | + for expr in queryset.query.order_by: |
| 815 | + if isinstance(expr, str): |
| 816 | + ordering.append(expr) |
| 817 | + |
| 818 | + elif isinstance(expr, OrderBy): |
| 819 | + field_name = expr.expression.name |
| 820 | + descending = expr.descending |
| 821 | + ordering.append(f"{'-' if descending else ''}{field_name}") |
| 822 | + |
| 823 | + return ordering |
| 824 | + |
809 | 825 | ordering = self.ordering |
810 | 826 |
|
811 | 827 | assert ordering is not None, ( |
|
0 commit comments