djangodjango-rest-frameworkdjango-serializer

How to pass a query parameter to SerializerMethodField in django rest framework?


I want to filter out some instance based on the query parameter I get in the GET call.

class RevisionSerializer(serializers.ModelSerializer):
    slot_info = serializers.SerializerMethodField(required=False, read_only=True)
    batch_config = serializers.SerializerMethodField(required=False, read_only=True)

    class Meta:
        model = Revision
        fields = ['id', 'status', 'revision_id', 'instructor', 'number_of_classes', 'start_date',
                  'slot', 'slot_info', 'tinyurl', 'zoom_link', 'batch_config']
        read_only_fields = ['revision_id']

    def get_batch_config(self, obj):
        # filter this on the incoming data from the GET call
        related_batches = CompensationClass.objects.select_related('style', 'instructor').filter(
            compensation_class_id=obj.revision_id)

        batch_config_values = related_batches.values('batch_id', 'age_group', 'level', 'course_version', 'style__name',
                                                     'class_number')
        return batch_config_values

This is my serializer and I will be passing one date and based on that date I want to filter my serializermethodfield. How can I achieve this?


Solution

  • You can pass parameters to a Serializer using its context:

    # views.py
    class RevisionView(GenericAPIView):
        serializer_class = RevisionSerializer
    
        def get_serializer_context(self):
            return {'revision_id': self.request.GET.get('revision_id')}
    
    
    # serializers.py
    class RevisionSerializer(serializers.ModelSerializer):
        
        def get_batch_config(self, obj):
            related_batches = CompensationClass.objects.select_related(
                'style', 'instructor',
            ).filter(
                compensation_class_id=self.context.get('revision_id')
            )
            [...]