MCPcopy
hub / github.com/django/django / _order_by_pairs

Method _order_by_pairs

django/db/models/sql/compiler.py:338–477  ·  view source on GitHub ↗
(self)

Source from the content-addressed store, hash-verified

336 return ret, klass_info, annotations
337
338 def _order_by_pairs(self):
339 if self.query.extra_order_by:
340 ordering = self.query.extra_order_by
341 elif not self.query.default_ordering:
342 ordering = self.query.order_by
343 elif self.query.order_by:
344 ordering = self.query.order_by
345 elif (meta := self.query.get_meta()) and meta.ordering:
346 ordering = meta.ordering
347 self._meta_ordering = ordering
348 else:
349 ordering = []
350 if self.query.standard_ordering:
351 default_order, _ = ORDER_DIR["ASC"]
352 else:
353 default_order, _ = ORDER_DIR["DESC"]
354
355 selected_exprs = {}
356 # Avoid computing `selected_exprs` if there is no `ordering` as it's
357 # relatively expensive.
358 if ordering and (select := self.select):
359 for ordinal, (expr, _, alias) in enumerate(select, start=1):
360 pos_expr = PositionRef(ordinal, alias, expr)
361 if alias:
362 selected_exprs[alias] = pos_expr
363 selected_exprs[expr] = pos_expr
364
365 for field in ordering:
366 if hasattr(field, "resolve_expression"):
367 if isinstance(field, Value):
368 # output_field must be resolved for constants.
369 field = Cast(field, field.output_field)
370 if not isinstance(field, OrderBy):
371 field = field.asc()
372 if not self.query.standard_ordering:
373 field = field.copy()
374 field.reverse_ordering()
375 select_ref = selected_exprs.get(field.expression)
376 if select_ref or (
377 isinstance(field.expression, F)
378 and (select_ref := selected_exprs.get(field.expression.name))
379 ):
380 # Emulation of NULLS (FIRST|LAST) cannot be combined with
381 # the usage of ordering by position.
382 if (
383 field.nulls_first is None and field.nulls_last is None
384 ) or self.connection.features.supports_order_by_nulls_modifier:
385 field = field.copy()
386 field.expression = select_ref
387 # Alias collisions are not possible when dealing with
388 # combined queries so fallback to it if emulation of NULLS
389 # handling is required.
390 elif self.query.combinator:
391 field = field.copy()
392 field.expression = Ref(select_ref.refs, select_ref.source)
393 yield field, select_ref is not None
394 continue
395 if field == "?": # random

Callers 1

get_order_byMethod · 0.95

Calls 15

quote_nameMethod · 0.95
find_ordering_nameMethod · 0.95
CastClass · 0.90
RefClass · 0.90
OrderByClass · 0.90
RandomClass · 0.90
get_order_dirFunction · 0.90
FClass · 0.90
RawSQLClass · 0.90
PositionRefClass · 0.85
try_transformMethod · 0.80
get_metaMethod · 0.45

Tested by

no test coverage detected