Пользовательский запрос для Django Rest Framework - PullRequest
0 голосов
/ 16 мая 2018

Базовая настройка DRF для моего маленького Backcast Backend работает довольно хорошо:

router.register(r'episodes', views.EpisodeViewSet)

urlpatterns = [
    path('admin/', admin.site.urls),
    url(r'^api/', include(router.urls)),
]

в urls.py

и

class EpisodeSerializer(serializers.ModelSerializer):
    # show = ShowSerializer()

    class Meta:
        model = Episode
        depth = 1


class EpisodeDetailSerializer(serializers.ModelSerializer):
    chapters = ChapterMarkSerializer(source='chaptermark_set', many=True)
    media = MediaClipSerializer(source='mediaclip_set', many=True)
    show = ShowSerializer()

    class Meta:
        model = Episode
        depth = 1

в serializers.py, а также

class EpisodeViewSet(viewsets.ModelViewSet):
    queryset = Episode.objects.all().order_by('-published_at')

    def get_serializer_class(self):
        if self.action == 'retrieve':
            return EpisodeDetailSerializer
        return EpisodeSerializer

хорошо работает для создания полного списка эпизодов (я немного разбил классы, они дополнительно содержат некоторые фильтры полей, но это не связано), а также для подробного представления с гиперссылкой для каждого эпизода.

Кроме того, мне нужна возможность запрашивать эпизоды по другим полям. Особенно поле «число» и «show_id»

Кажется, я не могу понять, как это делается в DRF. Я уже пытался добавить def get_queryset () в класс EpisodeDetailSerializer, но это не сработало.

Так что я ищу, чтобы обработать что-то вроде

/api/episodes/?show_id=2&number=24 

для доставки деталей эпизода вместо значения по умолчанию

/api/episodes/123

любая помощь приветствуется.

1 Ответ

0 голосов
/ 16 мая 2018

Вы можете использовать django_filters:

from django_filters.rest_framework import DjangoFilterBackend

class EpisodeViewSet(viewsets.ModelViewSet):
    queryset = Episode.objects.all().order_by('-published_at')
    filter_backends = (DjangoFilterBackend,)
    filter_fields = ('show_id', 'number')

    def get_serializer_class(self):
        if self.action == 'retrieve' or self.request.GET.get('show_id') and self.request.GET.get('number'):
            return EpisodeDetailSerializer
        return EpisodeSerializer
...