﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
14336	list_display should be able to contain sortable references to annotated fields	Paul McLanahan		"Overriding the `queryset` method of a `ModelAdmin` should be an easy way to annotate the `QuerySet` used in the admin list view for a model. My use case is that I have two `IntegerField`s containing counts of various things, but what I'd like to be able to display and sort by in the admin list view is the sum of these two fields. This can best be explained by an example:

{{{
#!python
# Given this model
class Article(models.Model):
    title = models.CharField(max_length=255)
    num_a = models.PositiveIntegerField()
    num_b = models.PositiveIntegerField()

# Want ModelAdmin like...
class ArticleAdmin(admin.ModelAdmin):
    list_display = ('title' 'total_nums')
    
    def queryset(self, request):
        qs = super(ArticleAdmin, self).queryset(request)
        return qs.extra(select={'total_nums':'num_a + num_b'})
}}}

This fails at model validation with a `ImproperlyConfigured` exception in `django.contrib.admin.validation.validate` because the model has no 'total_nums' field, which we know. But the model validation mechanism has no access to the instance of the `ModelAdmin`, and therefore no access to the queryset to be able to check for any extras or annotations.

I tried fixing this and would have submitted a patch, but I failed in the time I had. However, there is a workaround I discovered and am using, but it seems silly. You change `ArticleAdmin` to the following:

{{{
#!python
class ArticleAdmin(admin.ModelAdmin):
    list_display = ('title' 'total')
    
    def total(self, obj):
        return obj.total_nums
    total.admin_order_field = 'total_nums'
    
    def queryset(self, request):
        qs = super(ArticleAdmin, self).queryset(request)
        return qs.extra(select={'total_nums':'num_a + num_b'})
}}}

This seems overly verbose and a little hacky, but it does work. I'd say that makes this ticket non-urgent, though I do wonder how many developers gave up before discovering this technique."	New feature	new	contrib.admin	1.2	Normal			riccardo.magliocchetti@… jon.c.culver@… Olivier Dalang	Accepted	1	1	0	0	0	0
