#django #api #url #filter #django-rest-framework
#django #API #url #Фильтр #django-rest-framework
Вопрос:
Я пытаюсь отфильтровать свою модель «Сообщений» по параметру, переданному в строку запроса в URL. Если этот параметр не задан, я хочу, чтобы URL-адрес просто возвращал все сообщения.
Насколько я понимаю (очевидно, неверно), это должно работать следующим образом:
urls.py:
path('feed?category=<str:category>', views.Posts.as_view())
views.py:
def Posts(APIView):
def get(self, request, **kwargs):
if self.kwargs['category']:
queryset = Post.objects.filter(category_name = self.kwargs['category'])
else:
queryset = Post.objects.all()
С помощью приведенного выше кода я ожидаю, что, запрашивая URL .../feed
-адрес, представление установит набор запросов для всех сообщений, однако, если я введу URL .../feed?category=x
-адрес, он вернет только сообщения этой категории.
В настоящее время программа не функционирует как таковая. Как мне выполнить эту функциональность?
Спасибо, Grae
Комментарии:
1.
path
проверяет только путь к URL-адресу, часть после?
не является путем, то есть строкой запроса , поэтому вы не можете фильтровать по этому пути.
Ответ №1:
path
проверяет только путь к URL-адресу, часть после ?
не является путем, то есть строкой запроса [wiki], поэтому вы не можете фильтровать по этому пути. Строка запроса хранится в request.GET
объекте, подобном словарю.
Таким образом, вы определяете путь как:
path('feed/', views.PostView.as_view())
и в представлении вы можете фильтровать с помощью:
def PostView(APIView):
model = Post
def get_queryset(self, *args, **kwargs):
queryset = super().get_queryset(*args, **kwargs)
if 'category' in self.request.GET:
return queryset.filter(category_name=self.request.GET['category'])
return queryset
Примечание: в Django представления на основе классов (CBV) часто имеют
…View
суффикс, чтобы избежать столкновения с именами моделей.
Поэтому вы можете рассмотреть возможность переименования класса view вPostView
, вместо.Posts
Комментарии:
1. Если строка запроса является элементом словаря, то могу ли я не получить доступ к переменной ‘category’ с помощью self.kwargs [‘category’] ?
2. Будет ли работать вместо этого использовать: if ‘category’ в self.request.kwargs ?
3.@GraeCumming: нет, у
request
объекта нет.kwargs
, есть только у представления.self.kwargs
Не содержат элементов в строке запроса, только переменные пути.