Deprecate select_related() with no arguments
Currently, it’s possible to call select_related() with no arguments, documented thusly:
There may be some situations where you wish to call select_related() with a lot of related objects, or where you don’t know all of the relations. In these cases it is possible to call select_related() with no arguments. This will follow all non-null foreign keys it can find - nullable foreign keys must be specified. This is not recommended in most cases as it is likely to make the underlying query more complex, and return more data, than is actually needed.
In a comment thread discussing select_related() with no arguments, four contributors agreed it would be worth deprecating, due to its poor performance implications, degrading every time the given model gains a relation.
This deprecation would need to affect both select_related() with no arguments and the ModelAdmin.list_select_related = True option that uses it.
Change History
(12)
| Triage Stage: |
Unreviewed → Accepted
|
| Owner: |
set to Adam Johnson
|
| Status: |
new → assigned
|
| Patch needs improvement: |
set
|
| Patch needs improvement: |
unset
|
| Triage Stage: |
Accepted → Ready for checkin
|
| Resolution: |
→ fixed
|
| Status: |
assigned → closed
|
As part of this work we discovered a bug in the admin where
select_related()was incorrectly used with the intent of "selecting all related objects" even though it (as documented) does not follow nullable relations. Mentioning as an additional justification for removing this problematic use instead of doubling down on it.For the upgrade path, the
FETCH_PEERSfetch mode is also an option now.