Return the list of ordering fields for the change list. First check the get_ordering() method in model admin, then check the object's default ordering. Then, any manually-specified ordering from the query string overrides anything. Finally, a deterministic or
(self, request, queryset)
| 373 | return getattr(attr, "admin_order_field", None) |
| 374 | |
| 375 | def get_ordering(self, request, queryset): |
| 376 | """ |
| 377 | Return the list of ordering fields for the change list. |
| 378 | First check the get_ordering() method in model admin, then check |
| 379 | the object's default ordering. Then, any manually-specified ordering |
| 380 | from the query string overrides anything. Finally, a deterministic |
| 381 | order is guaranteed by calling _get_deterministic_ordering() with the |
| 382 | constructed ordering. |
| 383 | """ |
| 384 | params = self.params |
| 385 | ordering = list( |
| 386 | self.model_admin.get_ordering(request) or self._get_default_ordering() |
| 387 | ) |
| 388 | if params.get(ORDER_VAR): |
| 389 | # Clear ordering and used params |
| 390 | ordering = [] |
| 391 | order_params = params[ORDER_VAR].split(".") |
| 392 | for p in order_params: |
| 393 | try: |
| 394 | none, pfx, idx = p.rpartition("-") |
| 395 | field_name = self.list_display[int(idx)] |
| 396 | order_field = self.get_ordering_field(field_name) |
| 397 | if not order_field: |
| 398 | continue # No 'admin_order_field', skip it |
| 399 | if isinstance(order_field, OrderBy): |
| 400 | if pfx == "-": |
| 401 | order_field = order_field.copy() |
| 402 | order_field.reverse_ordering() |
| 403 | ordering.append(order_field) |
| 404 | elif hasattr(order_field, "resolve_expression"): |
| 405 | # order_field is an expression. |
| 406 | ordering.append( |
| 407 | order_field.desc() if pfx == "-" else order_field.asc() |
| 408 | ) |
| 409 | # reverse order if order_field has already "-" as prefix |
| 410 | elif pfx == "-" and order_field.startswith(pfx): |
| 411 | ordering.append(order_field.removeprefix(pfx)) |
| 412 | else: |
| 413 | ordering.append(pfx + order_field) |
| 414 | except (IndexError, ValueError): |
| 415 | continue # Invalid ordering specified, skip it. |
| 416 | |
| 417 | # Add the given query's ordering fields, if any. |
| 418 | ordering.extend(queryset.query.order_by) |
| 419 | |
| 420 | if queryset.order_by(*ordering).totally_ordered: |
| 421 | return ordering |
| 422 | return ordering + ["-pk"] |
| 423 | |
| 424 | def get_ordering_field_columns(self): |
| 425 | """ |
no test coverage detected