Строка запроса [wiki] является , а не частью пути. Эти параметры можно получить в объекте request.GET
, который похож на словарь.
Ваш путь должен выглядеть следующим образом:
path('/', views.QuestionListView.as_view()),
В вашем QuestionListView
вы можете затем отфильтруйте эти параметры:
class QuestionListView(ListAPIView):
model = Question
serializers = QuestionSerializers
def get_queryset(self, *args, **kwargs):
queryset = super().get_queryset(*args, **kwargs)
if 'tag' in self.request.GET:
queryset = queryset.filter(
<b>Tag_name=self.request.GET['tag']</b>
)
if 'order_by' in self.request.GET:
queryset = queryset.order_by(<b>self.request.GET['order_by']</b>)
return queryset
# …
При этом, для вышеперечисленного потребуются дополнительные строительные леса. Здесь вы позволяете пользователям «вводить» элементы в .order_by(..)
. Хакер может использовать это, например, упорядочивая элементы по связанным данным и, таким образом, бинарный поиск в определенных полях.
Возможно, стоит взглянуть на django-filter
[ GitHub] , где вы можете определить, какие элементы вы можете фильтровать, и т. Д. c. Кроме того, он будет инкапсулировать фильтрацию, и, таким образом, будет удобно работать с этим в разных представлениях.
Примечание : обычно имена полей в модели Django записано в snake_case , а не PerlCase , поэтому должно быть: tags
вместо Tag_name
. Это потому, что ManyToManyField
относится к нулю, одному или нескольким тегам и, кроме того, относится к тегу объектов , а не к имени тегов.
Примечание : Вместо реализации представления с нуля, возможно, стоит взглянуть на ListAPIView
класс [drf-doc] который уже может реализовать много шаблонный код .