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')