【问题标题】:Custom query for Django Rest FrameworkDjango Rest Framework 的自定义查询
【发布时间】:2018-10-26 11:55:37
【问题描述】:

我的小 Podcast 后端的基本 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

感谢任何帮助。

【问题讨论】:

    标签: django django-rest-framework


    【解决方案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
    

    【讨论】:

    • 谢谢,这基本上已经有效了。只有一个问题:这只影响所有剧集的列表视图。 EpisodeDetailSerializer 是通过“检索”操作来实现的——至少我是这么认为的,我真的只是在慢慢地挖掘它。我需要的是获取由 show_id 和 number 过滤的剧集返回的详细序列化器。
    • @Helmi 您也可以尝试签入get_serializer_class self.request.GET.get('show_id') and self.request.GET.get('number')
    猜你喜欢
    • 2020-04-09
    • 1970-01-01
    • 2018-06-17
    • 1970-01-01
    • 2020-09-16
    • 2022-11-13
    • 2012-05-26
    • 2018-08-08
    • 2015-03-17
    相关资源
    最近更新 更多