NestedSimpleRouter без использования поиска в маршрутизаторе

#django #django-rest-framework #drf-nested-routers

#python #django #django-rest-framework #drf-nested-routers

Вопрос:

Я использую drf-nested-router что-то вроде следующего в моем url.py

 router = SimpleRouter()
profile_router = routers.NestedSimpleRouter(router, r'profile', lookup='user')
profile_router.register(r'comments', UserCommentViewSet, basename='profile-comments')
 

Набор представлений

 class UserCommentViewSet(CommentViewSet):
    def get_queryset(self):
        return Comment.objects.filter(owner=self.request.user)
 

Итак, URL-адрес выглядит примерно так,

 mydomain.com/profile/{profile_id}/comments/
 

это дает мне правильные результаты. Но следующий URL-адрес также дает мне правильные результаты,

 mydomain.com/profile/{anything}/comments/
 

потому что я использую информацию о пользователе сеанса для фильтрации данных. Можно ли сделать URL таким

 mydomain.com/profile/comments/
 

Комментарии:

1. Рассматривали ли вы возможность создания viewset для profile. И добавление @action(detail=False) для комментариев?

Ответ №1:

На основе вашего кода:

 router = SimpleRouter()
# router.register('users', UserViewSet, 'user')
profile_router = routers.NestedSimpleRouter(router, r'profile', lookup='user')
profile_router.register(r'comments', UserCommentViewSet, basename='profile-comments')
 

Вы неправильно интерпретируете это. Вот как вы можете использовать NestedSimpleRouter

 mydomain.com/profile/ # list all the users.
mydomain.com/profile/{profile_id} # retrieve particular user based on profile_id/user_id/pk.
mydomain.com/profile/{profile_id}/comments/ # list all the comments belong to a particular user (not the current session user) based on profile_id/user_id.
mydomain.com/profile/{profile_id}/comments/{comment_id} # retrieve particular comment based on comment_id.
 

Этот URL:

 mydomain.com/profile/{anything}/comments/
 

работает, потому что вы фильтруете по owner = request.user .

И этот URL:

 mydomain.com/profile/{profile_id}/comments/
 

предполагается предоставить список всех комментариев, введя profile_id UserCommentViewSet . Таким образом, ваше представление будет похоже:

 class UserCommentViewSet(CommentViewSet):
    def get_queryset(self):
        return Comment.objects.filter(owner__id=profile_id)
 

Простыми словами вы можете использовать NestedSimpleRouter для получения всех пользователей, сведений о пользователе, всех комментариев, опубликованных одним пользователем, и подробных комментариев.

Решение:

Если вам нужны только текущие (сеансовые) комментарии пользователя (поскольку вам не нужны все комментарии всех пользователей), вам нужно что-то вроде:

 router = SimpleRouter()
router.register(r'profile/comments', UserCommentViewSet, basename='profile-comments')
 

и UserCommentViewSet это:

 class UserCommentViewSet(CommentViewSet):
    def get_queryset(self):
        return Comment.objects.filter(owner=self.request.user)
 

Затем этот URL:

 mydomain.com/profile/comments/
 

предоставит все комментарии по мере необходимости.

Комментарии:

1. Спасибо за ваш ответ. Однако я попробовал это, и это не сработало. Сообщение об ошибке «подробно»: «Не найдено».

2. Я только что нашел причину: «профиль» уже зарегистрирован, поэтому «профиль / что-то» выдает не найдено. Вы знаете, как решить эту проблему?

3. Я не давал код для профиля / чего-то. Это не сработает. Пожалуйста, внимательно прочитайте ответ. Вам не нужны комментарии всех пользователей, верно? Вам нужны только комментарии пользователя текущего сеанса в профиле url / комментариях. Это то, что вы задали в вопросе. Теперь не используйте profile / something. Просто используйте profile / comment. Если ошибка все еще сохраняется. Не могли бы вы опубликовать все ошибки?

4. извините за недоразумение. Я имел в виду, что у меня есть URL / profile и /profile /комментарии. Теперь /profile/comments работает только тогда, когда я комментирую URL /profile.

5. что вы хотите показать в /profile? все пользователи или запрос текущего сеанса.user?