django-rest-framework-json-api
django-rest-framework-json-api copied to clipboard
SparseFieldsetsMixin does not use the correct configured JSON_API_FORMAT_FIELD_NAMES
Description of the Bug Report
SparseFieldsetsMixin
does not adjust field_names by configured format.
Fix:
class SparseFieldsetsMixin:
"""
A serializer mixin that adds support for sparse fieldsets through `fields` query parameter.
Specification: https://jsonapi.org/format/#fetching-sparse-fieldsets
"""
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
context = kwargs.get("context")
request = context.get("request") if context else None
if request:
sparse_fieldset_query_param = "fields[{}]".format(
get_resource_type_from_serializer(self)
)
try:
param_name = next(
key
for key in request.query_params
if sparse_fieldset_query_param == key
)
except StopIteration:
pass
else:
fieldset = request.query_params.get(param_name).split(",")
# iterate over a *copy* of self.fields' underlying OrderedDict, because we may
# modify the original during the iteration.
# self.fields is a `rest_framework.utils.serializer_helpers.BindingDict`
for field_name, field in self.fields.fields.copy().items():
if (
field_name == api_settings.URL_FIELD_NAME
): # leave self link there
continue
# missing format_value()
correct_field_name = format_value(field_name, json_api_settings.FORMAT_FIELD_NAMES)
if correct_field_name not in fieldset:
self.fields.pop(field_name)
Checklist
- [x] Certain that this is a bug (if unsure or you have a question use discussions instead)
- [x] Code snippet or unit test added to reproduce bug
I agree this is a bug. For compatibility as we do it in other spots it is better to run undo_format_field_name
on the fieldset to solve this issue. PR is welcome.