3

我是 DRF 的新手。我在http://www.django-rest-framework.org/api-guide/filtering/#filtering-and-object-lookups浏览了过滤查询集的示例

此链接包含有关查询集过滤以及 DjangoFilterBackend 的描述。据我所知,它们的目的是相同的。但尚不清楚何时使用其中任何一种。在某些情况下,同时使用 queryset 和 filter_backends:-

class UserListView(generics.ListAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    filter_backends = (filters.OrderingFilter,)
    ordering_fields = ('username', 'email')

谁能告诉我,这两者有什么区别?必须使用这两者中的哪一个,在什么情况下,我们必须更喜欢一个而不是另一个?

提前致谢

4

1 回答 1

2

DjangoFilterBackend 提供了现成的过滤实现。认为它与 api_view 与通用 ListApiView 相同。过滤后端允许您通过编写一行代码(即启用过滤器后端)来实现各种过滤(搜索、排序等)。您可以通过不使用任何过滤器后端而是使用查询参数过滤自己来获得相同的结果。

稍后可能看起来像这样:

for q_key in request.query_params.keys():
        if q_key == 'from_ts':
            from_timestamp = int(request.query_params[q_key])
        elif q_key == 'to_ts':
            to_timestamp = int(request.query_params[q_key])
        elif q_key == 'location':
            location_id = (request.query_params[q_key])
        elif q_key == 'from_rating':
            rating_low = int(request.query_params[q_key])
        elif q_key == 'to_rating':
            rating_high = int(request.query_params[q_key])

并使用这些参数进行过滤:

snippets = ParResponse.objects.filter(
        device__location__id=location_id,
        owner_user=request.user,
        timestamp__gte=end_date,
        timestamp__lte=from_date,
        overall_rating__lte=rating_high,
        overall_rating__gte=rating_low,
        ).order_by('-timestamp')
于 2018-01-06T07:13:09.017 回答