Ответы пользователя по тегу Django Rest Framework
  • Оптимальная реализация связки Django + React в сложном SPA приложении?

    @javedimka
    Хочу сока
    Ну смотри, для создания связки Django + React, наиболее оптимальным видится взять Django и React.

    P.S. почему вообще рассматривается пункт под номером 1, если ты собрался ещё и мобильное приложение пилить и тебе нужен АПИ?
    Давай лучше от qna сайтов отдохни, сядь, напиши на листочке что тебе нужно и подумай, а то набросился, на большой СПА проект, не подумав.
    Ответ написан
    2 комментария
  • DRF что по ViewSet?

    @javedimka
    Хочу сока
    Использовать нужно то, что соответствует твоим потребностям. Нужна самая простая и обычная функциональность - используй вью сет. Нужно что-то посложнее - используй то, что лежит на уровне ниже.
    Ответ написан
    Комментировать
  • Проблема в DRF при работе с dynamically modifying fields. Что можно сделать?

    @javedimka
    Хочу сока
    Оригинальный ответ
    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')
    Ответ написан
    3 комментария