jazzband / django-polymorphic

Improved Django model inheritance with automatic downcasting
https://django-polymorphic.readthedocs.io
Other
1.64k stars 280 forks source link

Related polymorphic query support inc select_related and prefetch_related #545

Open pgammans opened 1 year ago

pgammans commented 1 year ago

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

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

PetrDlouhy commented 8 months ago

@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

alphatownsman commented 4 months ago

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?

Morfild commented 2 months ago

Are you going to merge it one day?