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