Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 955b28c

Browse files
committedApr 16, 2021
Avoided error when using include query parameter on related urls
This is a regression from version 4.1.0.
1 parent 51daed1 commit 955b28c

File tree

5 files changed

+32
-4
lines changed

5 files changed

+32
-4
lines changed
 

‎CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ any parts of the framework not mentioned in the documentation should generally b
1414

1515
* Added support for Django 3.2.
1616

17+
### Fixed
18+
19+
* Avoided error when using `include` query parameter on related urls (a regression since 4.1.0)
20+
1721
## [4.1.0] - 2021-03-08
1822

1923
### Added

‎example/tests/integration/test_browsable_api.py

+11
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,17 @@ def test_browsable_api_with_included_serializers(single_entry, client):
1818
)
1919

2020

21+
def test_browsable_api_on_related_url(author, client):
22+
url = reverse("author-related", kwargs={"pk": author.pk, "related_field": "bio"})
23+
response = client.get(url, data={"format": "api"})
24+
content = str(response.content)
25+
assert response.status_code == 200
26+
assert re.search(r"JSON:API includes", content)
27+
assert re.search(
28+
r'<input type="checkbox" name="includes" [^>]* value="metadata"', content
29+
)
30+
31+
2132
def test_browsable_api_with_no_included_serializers(client):
2233
response = client.get(reverse("projecttype-list", kwargs={"format": "api"}))
2334
content = str(response.content)

‎example/tests/test_views.py

+9-2
Original file line numberDiff line numberDiff line change
@@ -433,7 +433,7 @@ def test_retrieve_related_single_reverse_lookup(self):
433433
url = reverse(
434434
"author-related", kwargs={"pk": self.author.pk, "related_field": "bio"}
435435
)
436-
resp = self.client.get(url)
436+
resp = self.client.get(url, data={"include": "metadata"})
437437
expected = {
438438
"data": {
439439
"type": "authorBios",
@@ -448,7 +448,14 @@ def test_retrieve_related_single_reverse_lookup(self):
448448
},
449449
},
450450
"attributes": {"body": str(self.author.bio.body)},
451-
}
451+
},
452+
"included": [
453+
{
454+
"attributes": {"body": str(self.author.bio.metadata.body)},
455+
"id": str(self.author.bio.metadata.id),
456+
"type": "authorBioMetadata",
457+
}
458+
],
452459
}
453460
self.assertEqual(resp.status_code, 200)
454461
self.assertEqual(resp.json(), expected)

‎rest_framework_json_api/renderers.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -708,7 +708,10 @@ def _get_included_serializers(cls, serializer, prefix="", already_seen=None):
708708

709709
def get_includes_form(self, view):
710710
try:
711-
serializer_class = view.get_serializer_class()
711+
if "related_field" in view.kwargs:
712+
serializer_class = view.get_related_serializer_class()
713+
else:
714+
serializer_class = view.get_serializer_class()
712715
except AttributeError:
713716
return
714717

‎rest_framework_json_api/serializers.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,10 @@ def validate_path(serializer_class, field_path, path):
140140
included_resources = get_included_resources(request)
141141
for included_field_name in included_resources:
142142
included_field_path = included_field_name.split(".")
143-
this_serializer_class = view.get_serializer_class()
143+
if "related_field" in view.kwargs:
144+
this_serializer_class = view.get_related_serializer_class()
145+
else:
146+
this_serializer_class = view.get_serializer_class()
144147
# lets validate the current path
145148
validate_path(
146149
this_serializer_class, included_field_path, included_field_name

0 commit comments

Comments
 (0)
Please sign in to comment.