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,
InheritanceManager
does not supportprefetch_related
very well. This is mainly because Django'sprefetch_related_objects
expects the list it is given to be homogeneous, but forInheritanceIterable
it is not.This makes it so a
prefetch_related('child__relation')
will not work correctly in various ways, becauseprefetch_related
only looks at the first object in the list to make its decisionsAdditionally, a prefetch
child__relation
will not be accessible in a grandchild, because from Django's point of view that would bechild__grandchild__relation
.Solution
The solution has two parts:
InheritanceQuerySetMixin
now overrides_prefetch_related_objects
and 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_of
and simplified_get_ancestors_path
by using the API Django already provides. If needed I can split these changes off into their own PR.Commandments
CHANGES.rst
file to describe the changes, and quote according issue withGH-<issue_number>
.