django-polymorphic icon indicating copy to clipboard operation
django-polymorphic copied to clipboard

Related polymorphic query support inc select_related and prefetch_related

Open pgammans opened this issue 2 years ago • 3 comments

This pull request add support for select related and general related queries.

Summary To take advantage of this it requires that the plain Django model either adds a custom query set manager and uses that for queries where it wants the related object to be transmogrify into the final polymorphic type of that the default manager's queryset uses/ has PolymorphicQuerySetMixin or PolymorphicRelatedQuerySet as a base class

ie class PlainModel(models.Model): objects = models.Manager.from_queryset(PolymorphicRelatedQuerySet)()

The default Django select_related can be used including which means this is simple to use from the Django admin.

Performance When using select_related we archive fetch of the data in a single query including all information required to transmogrify the related object. This is an improvement from n+1 (main line) or models + 1 (with #531)

Notes

  • This make a small change to the accessor function on the model allowing the base object to be fetched form the cached
  • This commit has to copy segments of Django internal for it RelatedPopulator and ModelIterable as there are no hooks.

It has minimal support for prefetch_related cannot fetch attributes not on all child models or via class names this may fix #498

Fixes: #198 #436 #359 #244

pgammans avatar Jun 26 '23 15:06 pgammans

@pgammans Thanks, this seems to be very useful improvement. Could you please rebase the code so that the tests would run against the current master?

Also I thing part of this PR should be change of documentation to reflect this, e.g.: https://django-polymorphic.readthedocs.io/en/stable/advanced.html?highlight=select_related#restrictions-caveats

PetrDlouhy avatar Jan 12 '24 14:01 PetrDlouhy

it will be really nice to have this.

there seems to be some minor formatting issues in the latest commits. @pgammans would it be possible to fix them?

alphatownsman avatar May 28 '24 23:05 alphatownsman

Are you going to merge it one day?

Morfild avatar Jul 27 '24 16:07 Morfild