From d03a22b655de090cf6a045144c4a11665e7bc465 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arttu=20Per=C3=A4l=C3=A4?= Date: Wed, 28 Jun 2023 08:55:23 +0300 Subject: [PATCH] Include meta section for SerializerMethodResourceRelatedField(many=True) Fixes #572 --- CHANGELOG.md | 2 ++ example/tests/integration/test_non_paginated_responses.py | 2 ++ example/tests/integration/test_pagination.py | 1 + example/tests/test_filters.py | 1 + rest_framework_json_api/renderers.py | 6 ++++++ 5 files changed, 12 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d494fc2a..a9dc65db 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,6 +40,8 @@ any parts of the framework not mentioned in the documentation should generally b return value.name ``` +* `SerializerMethodResourceRelatedField(many=True)` relationship data now includes a meta section. + ### Fixed * Refactored handling of the `sort` query parameter to fix duplicate declaration in the generated schema definition diff --git a/example/tests/integration/test_non_paginated_responses.py b/example/tests/integration/test_non_paginated_responses.py index 60376a8b..92d26de3 100644 --- a/example/tests/integration/test_non_paginated_responses.py +++ b/example/tests/integration/test_non_paginated_responses.py @@ -51,6 +51,7 @@ def test_multiple_entries_no_pagination(multiple_entries, client): "related": "http://testserver/entries/1/suggested/", "self": "http://testserver/entries/1/relationships/suggested", }, + "meta": {"count": 1}, }, "suggestedHyperlinked": { "links": { @@ -106,6 +107,7 @@ def test_multiple_entries_no_pagination(multiple_entries, client): "related": "http://testserver/entries/2/suggested/", "self": "http://testserver/entries/2/relationships/suggested", }, + "meta": {"count": 1}, }, "suggestedHyperlinked": { "links": { diff --git a/example/tests/integration/test_pagination.py b/example/tests/integration/test_pagination.py index 4c60e96e..1a4bd056 100644 --- a/example/tests/integration/test_pagination.py +++ b/example/tests/integration/test_pagination.py @@ -51,6 +51,7 @@ def test_pagination_with_single_entry(single_entry, client): "related": "http://testserver/entries/1/suggested/", "self": "http://testserver/entries/1/relationships/suggested", }, + "meta": {"count": 0}, }, "suggestedHyperlinked": { "links": { diff --git a/example/tests/test_filters.py b/example/tests/test_filters.py index ab74dd0b..87f9d059 100644 --- a/example/tests/test_filters.py +++ b/example/tests/test_filters.py @@ -512,6 +512,7 @@ def test_search_keywords(self): {"type": "entries", "id": "11"}, {"type": "entries", "id": "12"}, ], + "meta": {"count": 11}, }, "suggestedHyperlinked": { "links": { diff --git a/rest_framework_json_api/renderers.py b/rest_framework_json_api/renderers.py index f7660208..9a0d9c0c 100644 --- a/rest_framework_json_api/renderers.py +++ b/rest_framework_json_api/renderers.py @@ -19,6 +19,7 @@ from rest_framework_json_api import utils from rest_framework_json_api.relations import ( HyperlinkedMixin, + ManySerializerMethodResourceRelatedField, ResourceRelatedField, SkipDataMixin, ) @@ -152,6 +153,11 @@ def extract_relationships(cls, fields, resource, resource_instance): if not isinstance(field, SkipDataMixin): relation_data.update({"data": resource.get(field_name)}) + if isinstance(field, ManySerializerMethodResourceRelatedField): + relation_data.update( + {"meta": {"count": len(resource.get(field_name))}} + ) + data.update({field_name: relation_data}) continue