Django prefetch_related
ORM method can't prefetch lookups through
GenericForeginKey
's if they target different models.
This application solves this problem.
With GenericForeignKey
functionality, it is possible to refer to arbitrary
model. Let's ay we have Like model, which is naturally may refer to many types
of data (blogposts, users, photos, comments, etc).
And so it is desireable to be able to perform such lookups:
Like.objects.prefetch_related('content_object__followers', 'content_object__people_on_photo')
where followers
is the field of User
model and people_on_photo
the field of Photo
model.
Currently .prefetch_related
will raise an error like
Cannot find field "followers" on Photo object.
because it is assumed that lookups are 'strict', and data for each lookup belongs to one type.
django-deep-prefetch
removes this limitation and makes prefetches for
such lookups possible.
Create custom manager for your model using DeepPrefetchQuerySet
,
DeepPrefetchQuerySetMixin
, DeepPrefetchManager
,
DeepPrefetchManagerMixin
classes from deep_prefetch.utils
module.
Then just use prefetch_related
ORM method.
App passes all tests except one from prefetch_related section of
Django own test-suite.
tests_from_django.PrefetchRelatedTests.test_attribute_error
fails because
prefetch_related
replacement not throws exception in case if field
defined in lookup not found on retrieved object. This is expected -
because deep_prefetch
does not assume that data is of same type -
it not throws exception.
There is also one internal test for case of prefetch of fields of different
models through GFK
.
To run tests, install tox and call tox
command in project
root directory.
Currently project compatible with Python 3.5 and Django 1.8.16.