django-rest-framework-json-api icon indicating copy to clipboard operation
django-rest-framework-json-api copied to clipboard

SparseFieldsetsMixin does not use the correct configured JSON_API_FORMAT_FIELD_NAMES

Open jokiefer opened this issue 3 years ago • 1 comments

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

jokiefer avatar Feb 15 '22 07:02 jokiefer

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.

sliverc avatar Feb 15 '22 17:02 sliverc