﻿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
10742	ModelAdmin.list_select_related needs three-valued logic to support custom select_related() calls	mrts	nobody	"If any of the related fields in a model is nullable, e.g.

{{{
class C(Base):
    a = models.ForeignKey(A, blank=True, null=True)
    b = models.ForeignKey(B)
    is_published = models.BooleanField()
}}}

, `select_related()` does not pull them in by default (see http://docs.djangoproject.com/en/dev/ref/models/querysets/#select-related).

Forcing it explicitly as follows

{{{
class CAdmin(admin.ModelAdmin):
    list_display = ('name', 'a', 'b', 'is_published')
    list_select_related = None

    def queryset(self, request):
        qs = super(CAdmin, self).queryset(request)
        return qs.select_related('a', 'b')
}}}

has no effect, as `ChangeList.get_query_set()` blindly overrides it with a plain `select_related()` (see [source:django/trunk/django/contrib/admin/views/main.py@10407#L201]).

To get the desired behviour of pulling in the nullable relations in a single query, three-valued logic is required for `ModelAdmin.list_select_related`:
 * `True` -- always call `select_related()`,
 * `False` (the default) -- call `select_related()` if any of the fields in `list_display` is a foreign key,
 * `None` (added) -- leave the queryset alone.

Patch attached.

See also #10722 and http://groups.google.com/group/django-developers/browse_thread/thread/e1762a77979f7cbe ."		closed	contrib.admin	dev		duplicate	efficient-admin		Unreviewed	1	1	1	1	0	0
