【问题标题】:How to add search parameters to GET request in Django REST Framework?如何在 Django REST Framework 中向 GET 请求添加搜索参数?
【发布时间】:2015-01-11 13:09:05
【问题描述】:

在阅读并完成Django REST Framework tutorial 之后,如何对 GET 请求实施过滤器并不完全清楚。例如,ListAPIView 非常适合查看数据库中模型的所有实例。但是,如果我想限制结果(例如,对于 Book 模型,我可能想通过发布日期或作者等来限制结果)。似乎最好的方法是创建一个自定义的序列化器、视图等,并且基本上都是手工编写的。

有没有更好的办法?

【问题讨论】:

    标签: python django rest django-rest-framework


    【解决方案1】:

    搜索参数在 django-rest-framework 中称为过滤器参数。应用过滤的方法有很多,请查看documentation

    在大多数情况下,您只需要覆盖视图,而不是序列化程序或任何其他模块。

    一个明显的方法是覆盖视图的查询集。示例:

    # access to /api/foo/?category=animal
    
    class FooListView(generics.ListAPIView):
        model = Foo
        serializer_class = FooSerializer
    
        def get_queryset(self):
            qs = super(FooListView, self).get_queryset()
            category = self.request.query_params.get("category", None)
            if category:
                qs = qs.filter(category=category)
            return qs
    

    但是,django-rest-framework 允许使用 django-filter 自动执行此类操作。

    先安装:

    pip install django-filter
    

    然后在您的视图中指定要过滤的字段:

    class FooListView(generics.ListAPIView):
        model = Foo
        serializer_class = FooSerializer
        filter_fields = ('category', )
    

    这将与前面的示例一样,但使用的代码更少。

    有很多方法可以自定义此过滤,详情请查看herehere

    还有一种方式可以申请filtering globally

    REST_FRAMEWORK = {
        'DEFAULT_FILTER_BACKENDS': ('rest_framework.filters.DjangoFilterBackend',)
    }
    

    【讨论】: