Add support for prefetch_related to InheritanceManager
#639
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Problem
Currently,
InheritanceManagerdoes not supportprefetch_relatedvery well. This is mainly because Django'sprefetch_related_objectsexpects the list it is given to be homogeneous, but forInheritanceIterableit is not.This makes it so a
prefetch_related('child__relation')will not work correctly in various ways, becauseprefetch_relatedonly looks at the first object in the list to make its decisionsAdditionally, a prefetch
child__relationwill not be accessible in a grandchild, because from Django's point of view that would bechild__grandchild__relation.Solution
The solution has two parts:
InheritanceQuerySetMixinnow overrides_prefetch_related_objectsand instead of usingself._result_cache(which has the subclasses generated byInheritanceIterable) it first reconstructs the list of base objects. It then uses the base objects forprefetch_related_objects. This makesprefetch_related('child__relation')work.In the process I have also fixed the use of raw SQL in
instance_ofand simplified_get_ancestors_pathby using the API Django already provides. If needed I can split these changes off into their own PR.Commandments
CHANGES.rstfile to describe the changes, and quote according issue withGH-<issue_number>.