Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit d3bb2b2

Browse files
bor3hamjarekwg
authored andcommitted
Now works with nested relationship prefetching.
The validation here is awkward (following the relationships through the model fields), I couldn't find a better way to ensure the included args exist for a django prefetch rather than erroring out.
1 parent ccd2681 commit d3bb2b2

File tree

1 file changed

+23
-6
lines changed

1 file changed

+23
-6
lines changed

‎rest_framework_json_api/views.py‎

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,30 @@ class ModelViewSet(viewsets.ModelViewSet):
2828
def get_queryset(self, *args, **kwargs):
2929
qs = super().get_queryset(*args, **kwargs)
3030
included_resources = get_included_resources(self.request)
31+
3132
for included in included_resources:
32-
if not hasattr(qs.model, included):
33-
continue
34-
if issubclass(getattr(qs.model, included).__class__, ForwardManyToOneDescriptor):
35-
qs = qs.prefetch_related(included)
36-
elif issubclass(getattr(qs.model, included).__class__, ManyToManyDescriptor):
37-
qs = qs.prefetch_related(included)
33+
included_model = None
34+
levels = included.split('.')
35+
level_model = qs.model
36+
for level in levels:
37+
if not hasattr(level_model, level):
38+
break
39+
field = getattr(level_model, level)
40+
field_class = field.__class__
41+
if not (
42+
issubclass(field_class, ForwardManyToOneDescriptor)
43+
or issubclass(field_class, ManyToManyDescriptor)
44+
):
45+
break
46+
47+
if level == levels[-1]:
48+
included_model = field
49+
else:
50+
level_model = field.get_queryset().model
51+
52+
if included_model is not None:
53+
qs = qs.prefetch_related(included.replace('.', '__'))
54+
3855
return qs
3956

4057

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /