From e934d4823aec1f69ff96527314ac93c0e0af9f2c Mon Sep 17 00:00:00 2001 From: Oliver Sauder Date: Thu, 17 Jul 2025 22:18:06 +0700 Subject: [PATCH 1/2] Ensured that sparse fieldset support formatted field names --- CHANGELOG.md | 1 + rest_framework_json_api/serializers.py | 6 +++++- tests/test_serializers.py | 20 ++++++++++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index eae89c70..9502f476 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ any parts of the framework not mentioned in the documentation should generally b * Ensured that interpreting `include` query parameter is done in internal Python naming. This adds full support for using multipart field names for includes while configuring `JSON_API_FORMAT_FIELD_NAMES`. +* Ensured that sparse fieldset fully supports `JSON_API_FORMAT_FIELD_NAMES`. ### Removed diff --git a/rest_framework_json_api/serializers.py b/rest_framework_json_api/serializers.py index 75764a5d..26f6b02e 100644 --- a/rest_framework_json_api/serializers.py +++ b/rest_framework_json_api/serializers.py @@ -26,6 +26,7 @@ get_resource_type_from_instance, get_resource_type_from_model, get_resource_type_from_serializer, + undo_format_field_name, ) @@ -89,7 +90,10 @@ def _readable_fields(self): sparse_fieldset_query_param ) if sparse_fieldset_value is not None: - sparse_fields = sparse_fieldset_value.split(",") + sparse_fields = [ + undo_format_field_name(sparse_field) + for sparse_field in sparse_fieldset_value.split(",") + ] return ( field for field in readable_fields diff --git a/tests/test_serializers.py b/tests/test_serializers.py index 9d4200a3..f82cb728 100644 --- a/tests/test_serializers.py +++ b/tests/test_serializers.py @@ -1,5 +1,6 @@ import pytest from django.db import models +from rest_framework.request import Request from rest_framework.utils import model_meta from rest_framework_json_api import serializers @@ -84,3 +85,22 @@ class Meta: "verified", "uuid", ] + + +def test_readable_fields_with_sparse_fields(client, rf, settings): + class TestSerializer(serializers.Serializer): + name = serializers.CharField() + value = serializers.CharField() + multi_part_name = serializers.CharField() + + class Meta: + resource_name = "test" + + settings.JSON_API_FORMAT_FIELD_NAMES = "camelCase" + request = Request(rf.get("/test/", {"fields[test]": "value,multiPartName"})) + context = {"request": request} + serializer = TestSerializer(context=context) + assert [field.field_name for field in serializer._readable_fields] == [ + "value", + "multi_part_name", + ] From 2109ad3bc2b46a9a88c59402c1c88399886ff2c3 Mon Sep 17 00:00:00 2001 From: Oliver Sauder Date: Fri, 18 Jul 2025 11:30:25 +0700 Subject: [PATCH 2/2] Fixed camelize format field name setting --- tests/test_serializers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_serializers.py b/tests/test_serializers.py index f82cb728..98cb2850 100644 --- a/tests/test_serializers.py +++ b/tests/test_serializers.py @@ -96,7 +96,7 @@ class TestSerializer(serializers.Serializer): class Meta: resource_name = "test" - settings.JSON_API_FORMAT_FIELD_NAMES = "camelCase" + settings.JSON_API_FORMAT_FIELD_NAMES = "camelize" request = Request(rf.get("/test/", {"fields[test]": "value,multiPartName"})) context = {"request": request} serializer = TestSerializer(context=context)