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