Страница не найдена Django restframework

Я пытаюсь написать API на Django, чтобы получать комментарии пользователей из URL.

Мой API:

class ListSpecificUserCommentsApiView(APIView):
    authentication_classes = [authentication.TokenAuthentication]
    permission_classes = [permissions.AllowAny]
    
    def get(self, request: HttpRequest, user) -> Response:
        username: User = User.objects.get(id=user.id)
        comments: Comment = Comment.objects.filter(user=username)
        serialized_comments: CommentModelSerializer = CommentModelSerializer(instance=comments, many=True).data
        
        return Response(serialized_comments)

и мой urls.py :

urlpatterns = [
    path(
        route='users',
        view=views.ListUsersApiView.as_view(),
        name='users',
    ),
    path(
        route='comments/<user>',
        view=views.ListSpecificUserCommentsApiView.as_view(),
        name='user-comments',
    ),
]

и все равно я сталкиваюсь с этой ошибкой Page not found.

Я попытался передать пользователя в качестве данных в DRF Response, как показано ниже:

class ListSpecificUserCommentsApiView(APIView):
    authentication_classes = [authentication.TokenAuthentication]
    permission_classes = [permissions.AllowAny]
    
    def get(self, request: HttpRequest, user) -> Response:
        username: User = User.objects.get(id=user.id)
        comments: Comment = Comment.objects.filter(user=username)
        serialized_comments: CommentModelSerializer = CommentModelSerializer(instance=comments, many=True).data
        
        return Response(serialized_comments, data=user)

но это не сработало.

Я не нашел никаких проблем с кодом. Одна подозрительная деталь - отсутствие последнего '/' в пути к урлам.

urlpatterns = [
    path(
        route='users',
        view=views.ListUsersApiView.as_view(),
        name='users',
    ),
    path(
        route='comments/<user>',
        view=views.ListSpecificUserCommentsApiView.as_view(),
        name='user-comments',
    ),
]

Если отправить запрос, добавив '/' в конце указанного пути, возникнет ошибка "Страница не найдена".

Добавьте последний '/' к каждому пути и попробуйте снова!

urlpatterns = [
    path(
        route='users/',
        view=views.ListUsersApiView.as_view(),
        name='users',
    ),
    path(
        route='comments/<user>/',
        view=views.ListSpecificUserCommentsApiView.as_view(),
        name='user-comments',
    ),
]

Дополнительно

urlpatterns = [
    ...
    path(
        route='comments/<user>/',
        view=views.ListSpecificUserCommentsApiView.as_view(),
        name='user-comments',
    ),
]

Насколько я знаю, если вы не указываете тип для динамического пути, то значение, автоматически доставляемое по этому пути, имеет тип str. -> str(доставленное значение)

class ListSpecificUserCommentsApiView(APIView):
    ...
    def get(self, request: HttpRequest, user) -> Response:
        username: User = User.objects.get(id=user.id)
        ...
        
        return Response(serialized_comments, data=user)

Когда вы пытаетесь импортировать объект пользователя через User.object.get, доставленный вами user.id пытается сослаться на id в str.

Возникает ошибка атрибута, потому что атрибут id не существует в объекте типа str.

Поскольку вы пытаетесь получить объект пользователя через id, измените динамический путь и функцию, как показано ниже.

#urls.py
urlpatterns = [
    ...
    path(
        route='comments/<int:user_id>/',
        view=views.ListSpecificUserCommentsApiView.as_view(),
        name='user-comments',
    ),
]

#views.py
class ListSpecificUserCommentsApiView(APIView):
    ...
    def get(self, request: HttpRequest, user_id) -> Response:
        username: User = User.objects.get(id=user_id)
        ...
        
        return Response(serialized_comments, data=user)

Если вы пытаетесь получить объект пользователя через значение, отличное от id, пожалуйста, сообщите мне в комментариях, какое значение вы собираетесь получить!

Я понял, что в этом случае, используя APIView, я должен создать что-то вроде следующего кода в качестве моего Api View:

class ListSpecificUserCommentsApiView(APIView):
    permission_classes = [permissions.AllowAny]
    
    def get(self, request: HttpRequest, username) -> Response:
        try:
            user: User = User.objects.get(username=username)
        
        except User.DoesNotExist:
            return Response(
                {'error': 'User not Found'},
                status=status.HTTP_404_NOT_FOUND,
            )
            
        comments: Comment = Comment.objects.filter(user=user)
        serialized_comments: CommentModelSerializer = CommentModelSerializer(comments, many=True)
        
        return Response(
            data=serialized_comments.data, 
            status=status.HTTP_302_FOUND,
        )

А для urls.py :

path(
        route='comments/<str:username>/',
        view=views.ListSpecificUserCommentsApiView.as_view(),
        name='user-comments',
    ),
Вернуться на верх