@@ -403,12 +403,6 @@ def columns(self):
403
403
columns = (
404
404
self .get_default_columns (select_mask ) if self .query .default_cols else self .query .select
405
405
)
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 )
412
406
413
407
annotation_idx = 1
414
408
@@ -427,11 +421,28 @@ def project_field(column):
427
421
annotation_idx += 1
428
422
return target , column
429
423
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 ))
435
446
436
447
@cached_property
437
448
def base_table (self ):
@@ -478,7 +489,11 @@ def get_combinator_queries(self):
478
489
# If the columns list is limited, then all combined queries
479
490
# must have the same columns list. Set the selects defined on
480
491
# 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 :
482
497
compiler_ .query = compiler_ .query .clone ()
483
498
compiler_ .query .set_values (
484
499
(
0 commit comments