Django 5 для начинающих

Прогресс по курсу:  9/1004

8.5 Фильтрация, поиск
5 из 5 шагов пройдено

Фильтрация по URL

Другой стиль фильтрации может включать ограничение набора запросов на основе некоторой части URL. Например, если мы добавим в нашу конфигурацию urls.py приложения blog_api запись:

from django.urls import path, re_path
from .views import PostList, PostDetail, UserPostList

urlpatterns = [
    path("<int:pk>/", PostDetail.as_view(), name="post_detail"),
    path("", PostList.as_view(), name="post_list"),
    re_path('^user/(?P<id>.+)/$', UserPostList.as_view()), # new
]

Затем вы можете написать представление в blog_api/views.py, которое возвращает набор постов, отфильтрованный по имени пользователя в части URL:

class UserPostList(generics.ListAPIView):
    serializer_class = PostSerializer

    def get_queryset(self):
        user = self.kwargs['id']
        return Post.objects.filter(author=user)

Давайте будем проверять работу, для этого закомментируем функцию get_queryset в классе PostList. А переменную queryset раскомментируем.

 Теперь авторизуемся как пользователь и попробуем добавить новый пост в наш блог через апи:

И мы видим что наш пост добавился от author с id = 16.

Теперь перейдем по адресу http://127.0.0.1:8000/api/user/16/ и мы увидим все посты данного пользователя:

А если мы перейдем по адресу http://127.0.0.1:8000/api/user/1/ то там данного поста не будет, так как мы делаем фильтрацию постов по пользователю.


  • Комментария
Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий

Но ведь в конечном итоге все равно фильтрация получается по ID пользователя на который ведет внешний ключ. Во вьюхе можно было написать user = self.kwargs['id'] результат будет одинаковый.

@Евгений_Куликов, согласен, так будет логически правильнее. Только нужно еще изменить маршрут с username на id. Поправил в лекции.

@Илья_Перминов,  Да маршрут конечно должен измениться. Кстати о маршрутах, может стоит добавить в данный раздел курса немного информации об автоматической маршрутизации с использованием SimpleRouter (хотя не знаю, может далее где это есть) ?

view.py

@Anonymous_450292901, исправил, спасибо.

Подскажите, зачем здесь

Давайте будем проверять работу, для этого закомментируем функцию get_queryset в классе PostList. Теперь авторизуемся как пользователь и попробуем добавить новый пост в наш блог через апи:

была закомментирована строка? С незакомментированным методом все работает точно так же, мы же создаем новый объект. Разве что посмотреть в списке его мы не сможем

@ilya_kutaev, я поправил, в прошлом шаге мы закоментировали queryset, но добавили вывод через get_queryset.  В этом шаге "мы возвращаем как было" для представления PostList. Чтобы через него мы видели все записи, а через запросы /user/id/ уже видели записи для пользователей.