#10742 closed (duplicate)
ModelAdmin.list_select_related needs three-valued logic to support custom select_related() calls
Reported by: | mrts | Owned by: | nobody |
---|---|---|---|
Component: | contrib.admin | Version: | dev |
Severity: | Keywords: | efficient-admin | |
Cc: | Triage Stage: | Unreviewed | |
Has patch: | yes | Needs documentation: | yes |
Needs tests: | yes | Patch needs improvement: | yes |
Easy pickings: | no | UI/UX: | no |
Description
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 callselect_related()
,False
(the default) -- callselect_related()
if any of the fields inlist_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 .
Attachments (1)
Change History (4)
by , 16 years ago
Attachment: | 10742_three-valued-list_select_related.diff added |
---|
comment:1 by , 16 years ago
Keywords: | efficient-admin added |
---|---|
Needs documentation: | set |
Needs tests: | set |
Patch needs improvement: | set |
(I'll write proper tests and docs if this is accepted.)