Django Rest Framework

时间:2018-05-16 12:15:00

标签: django django-rest-framework

我的小播客后端的基本DRF设置运行良好:

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 :(得分:1)

您可以使用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