如何在Django REST Framework中向GET请求添加搜索参数?

时间:2014-11-14 07:26:20

标签: python django rest django-rest-framework

在阅读并完成Django REST Framework tutorial之后,如何在GET请求上实现过滤器并不是完全明显的。例如,ListAPIView非常适合查看数据库中Model的所有实例。但是,如果我想限制结果(例如,对于Book模型,我可能希望按发布日期或作者等限制结果)。似乎最好的方法是创建一个自定义的Serializer,View等,并基本上手工编写所有内容。

有更好的方法吗?

1 个答案:

答案 0 :(得分:7)

搜索参数在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',)
}