#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?