Оригинальный ответfrom rest_framework.response import Response
class TrainingDetailAPIView(RetrieveAPIView):
queryset = Training.objects.all()
serializer_class = TrainingSerializer
lookup_field = 'slug'
def retrieve(self, request, *args, **kwargs):
instance = self.get_object()
serializer = self.get_serializer(instance, fields=('title', 'description'))
return Response(serializer.data)
При работе с drf рекомендую на отдельной вкладке держать открытым гитхаб с сорцами.
UPD:
Оригинальное решение хоть и работает, но слегка кривоватое(первое что пришло в голову), правильнее будет переписать метод get_serializer():
class TrainingDetailAPIView(RetrieveAPIView):
queryset = Training.objects.all()
serializer_class = TrainingSerializer
lookup_field = 'slug'
def get_serializer(self, *args, **kwargs):
kwargs['fields'] = ('title', 'description')
return super().get_serializer(*args, **kwargs)
Меньше кода и не происходит его дупликации как в первом варианте при переписывании метода из retrieve миксина.
Если такая вью не единственная, то следует пойти дальше и написать свой миксин:
class ShowFieldsMixin:
def get_serializer(self, *args, **kwargs):
if getattr(self, 'fields_to_show', None) is not None:
kwargs['fields'] = self.fields_to_show
return super().get_serializer(*args, **kwargs)
class TrainingDetailAPIView(ShowFieldsMixin, RetrieveAPIView):
queryset = Training.objects.all()
serializer_class = TrainingSerializer
lookup_field = 'slug'
fields_to_show = ('title', 'description')
class TrainingListAPIView(ShowFieldsMixin, ListAPIView):
# bla-bla-bla
serializer_class = TrainingSerializer
fields_to_show = ('name', 'description', 'url', 'slug')