MCPcopy
hub / github.com/django/django / get_ordering

Method get_ordering

django/contrib/admin/views/main.py:375–422  ·  view source on GitHub ↗

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)

Source from the content-addressed store, hash-verified

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 """

Callers 2

get_querysetMethod · 0.95
field_admin_orderingMethod · 0.45

Calls 11

_get_default_orderingMethod · 0.95
get_ordering_fieldMethod · 0.95
extendMethod · 0.80
order_byMethod · 0.80
getMethod · 0.45
splitMethod · 0.45
copyMethod · 0.45
reverse_orderingMethod · 0.45
appendMethod · 0.45
descMethod · 0.45
ascMethod · 0.45

Tested by

no test coverage detected