ModelAdmin.list_select_related needs three-valued logic to support custom select_related() calls
|Reported by:||mrts||Owned by:||nobody|
|Has patch:||yes||Needs documentation:||yes|
|Needs tests:||yes||Patch needs improvement:||yes|
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.
Change History (4)
Changed 6 years ago by mrts
comment:1 Changed 6 years ago by mrts
- Keywords efficient-admin added
- Needs documentation set
- Needs tests set
- Patch needs improvement set
comment:2 Changed 6 years ago by jacob
- Resolution set to duplicate
- Status changed from new to closed