Как структурировать URL-адрес для фильтрации, если параметр строки запроса существует в Django

#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 Не содержат элементов в строке запроса, только переменные пути.