manosim / django-rest-framework-docs

Document Web APIs made with Django Rest Framework
https://www.drfdocs.com/
BSD 2-Clause "Simplified" License
647 stars 184 forks source link

get_serializer_class doesn't recreate same conditions as would be used by DRF #168

Open optiz0r opened 7 years ago

optiz0r commented 7 years ago

Where get_serializer_class() is used to determine which serializer would be used for a ModelViewSet, it doesn't re-create the same environment as DRF would use when servicing an actual API request, and so it may return different results (and thus incorrect documentation).

As an example, I have the following method, which uses a cut-down serializer for list actions, and a full-content serializer for retrieve actions:

class FooViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = Foo.objects.all()

    def get_serializer_class(self):
        if hasattr(self, 'action'):
            if self.action == 'list':
                return FooListSerializer
            elif self.action == 'retrieve':
                return FooSerializer

        return serializers.Default

drfdocs doesn't currently set the self.action member before calling get_serializer_class(), so it gets the default serializer with no fields, whereas an actual API request would get either the FooSerializer or the FooListSerializer.

mohammedzee1000 commented 6 years ago

+1 to this I am not able to use versioned docs properly api thanks to this