queryset vs filter_backends в структуре отдыха django

Я новичок в DRF. Я рассмотрел пример фильтрации набора запросов по адресу http://www.django-rest-framework.org/api-guide/filtering/.

Эта ссылка содержит описание фильтрации наборов запросов, а также DjangoFilterBackend. Насколько я могу понять, они служат той же цели. Но не ясно, когда использовать любой из них. В некоторых случаях используются как queryset, так и filter_backends:

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

Кто-нибудь может дать мне знать, в чем разница между этими двумя? Какой из этих двух нужно использовать, в каких ситуациях мы должны отдавать предпочтение одному?

заранее спасибо

1 ответ

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')
Другие вопросы по тегам