Как передать параметр запроса в SerializerMethodField в django rest framework?

Я хочу отфильтровать некоторый экземпляр на основе параметра запроса, который я получаю в вызове GET.

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

Это мой сериализатор и я буду передавать одну дату и на основе этой даты я хочу фильтровать поле serializermethod. Как я могу этого добиться?

Вы можете передавать параметры сериализатору, используя его контекст:

# 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'))

Спасибо @ThomasGth. Я сделал это следующим образом.

SERIALIZER

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 = '__all__'
        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):
        calendar_date = self.context.get('calendar_date')
        related_batches = CompensationClass.objects.select_related('style', 'instructor').filter(
            compensation_class_id=obj.revision_id)
        if calendar_date:
            related_batches = related_batches.filter(calendar_date)

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

VIEWSET

class RevisionViewset(viewsets.ModelViewSet):
    queryset = Revision.objects.all().order_by('-modified_at').select_related('instructor', 'slot')
    serializer_class = RevisionSerializer
    pagination_class = LimitOffsetPagination
    filter_backends = [DjangoFilterBackend, filters.SearchFilter]
    filterset_class = RevisionFilter


    def get_serializer_context(self):
        context = {'request': self.request}
        calendar_date = self.request.GET.get('calendar_date')
        if calendar_date:
            context['calendar_date'] = calendar_date
        return context



Вернуться на верх