0

I am trying to acsess fields of a model dynamically(on the basis of call from frontend) in the serializer but unable to do so

code:

class DynamicFieldsModelSerializer(serializers.ModelSerializer):

    def __init__(self, *args, **kwargs):
        super(DynamicFieldsModelSerializer, self).__init__(*args, **kwargs)
        print("self", self)
        fields = self.context['request'].query_params.get('fields')
        if fields:
            fields = fields.split(',')
            # Drop any fields that are not specified in the `fields` argument.
            allowed = set(fields)
            existing = set(self.fields.keys())
            for field_name in existing - allowed:
                self.fields.pop(field_name)

class ProductTestSerializer(DynamicFieldsModelSerializer, serializers.ModelSerializer):

    class Meta:
        model = Product
        fields = ("id",)

class ProductTestAPIView(generics.ListAPIView):

    def get(self, request):
        obj = Product.objects.all()
        data = ProductTestSerializer(obj, many=True)
        s_data = data.data
        return Response(s_data)

URL:

http://127.0.0.1:8000/products-test/?fields=id,short_code

It returns the following error:

KeyError: 'request'

at

fields = self.context['request'].query_params.get('fields')
Rahul Sharma
  • 2,187
  • 6
  • 31
  • 76
  • https://stackoverflow.com/questions/38281651/django-rest-framework-self-context-doesnt-have-request-attribute – Jisson Dec 12 '22 at 06:32

1 Answers1

1

Pass the request when calling the DynamicFieldsModelSerializer, like this:

serializer = DynamicFieldsModelSerializer(request.data, context={'request': request})
ShiBil PK
  • 588
  • 3
  • 13