@@ -402,12 +402,6 @@ def columns(self):
402402 columns = (
403403 self .get_default_columns (select_mask ) if self .query .default_cols else self .query .select
404404 )
405- # Populate QuerySet.select_related() data.
406- related_columns = []
407- if self .query .select_related :
408- self .get_related_selections (related_columns , select_mask )
409- if related_columns :
410- related_columns , _ = zip (* related_columns , strict = True )
411405
412406 annotation_idx = 1
413407
@@ -426,11 +420,28 @@ def project_field(column):
426420 annotation_idx += 1
427421 return target , column
428422
429- return (
430- tuple (map (project_field , columns ))
431- + tuple (self .annotations .items ())
432- + tuple (map (project_field , related_columns ))
433- )
423+ selected = []
424+ if self .query .selected is None :
425+ selected = [
426+ * (project_field (col ) for col in columns ),
427+ * self .annotations .items (),
428+ ]
429+ else :
430+ for expression in self .query .selected .values ():
431+ # Reference to an annotation.
432+ if isinstance (expression , str ):
433+ alias , expression = expression , self .annotations [expression ]
434+ # Reference to a column.
435+ elif isinstance (expression , int ):
436+ alias , expression = project_field (columns [expression ])
437+ selected .append ((alias , expression ))
438+ # Populate QuerySet.select_related() data.
439+ related_columns = []
440+ if self .query .select_related :
441+ self .get_related_selections (related_columns , select_mask )
442+ if related_columns :
443+ related_columns , _ = zip (* related_columns , strict = True )
444+ return tuple (selected ) + tuple (map (project_field , related_columns ))
434445
435446 @cached_property
436447 def base_table (self ):
@@ -477,7 +488,11 @@ def get_combinator_queries(self):
477488 # If the columns list is limited, then all combined queries
478489 # must have the same columns list. Set the selects defined on
479490 # the query on all combined queries, if not already set.
480- if not compiler_ .query .values_select and self .query .values_select :
491+ selected = self .query .selected
492+ if selected is not None and compiler_ .query .selected is None :
493+ compiler_ .query = compiler_ .query .clone ()
494+ compiler_ .query .set_values (selected )
495+ elif not compiler_ .query .values_select and self .query .values_select :
481496 compiler_ .query = compiler_ .query .clone ()
482497 compiler_ .query .set_values (
483498 (
0 commit comments