Как я могу получить комментарий, соответствующий сообщению в django rest framework?

#python #django #django-rest-framework

#python #django #django-rest-framework

Вопрос:

Я собираюсь создать API, который выводит комментарии из сообщения только тогда, когда я отправляю запрос на маршрутизатор с комментариями, прикрепленными к значению pk сообщения. Итак, URL-адреса следующим образом. После написания py и views.py , я отправил запрос, и произошла ошибка 404. Как я могу получить комментарии, создав API? Вот код, который я создал.

urls.py

 urlpatterns = [
    path('post', CreateReadPostView.as_view({'post': 'create', 'get': 'list'})),
    path('post/<int:pk>', UpdateDeletePostView.as_view({'put': 'update', 'patch': 'partial_update', 'delete': 'destroy'})),
    path('post/<int:post.pk>/comments', CreateReadCommentView.as_view({'post': 'create', 'get': 'list'})),
]   static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
  

views.py

 class CreateReadCommentView (ModelViewSet) :
    serializer_class = CommentSerializer
    permission_classes = [IsAuthenticated]
    queryset = Comment.objects.all()

    def perform_create (self, serializer) :
        serializer.save(author=self.request.user)
  

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

1. вы можете проверить drf-nested-routers

2. поскольку у вас уже есть структура url, вы можете просто использовать get_queryset() метод переопределения и не использовать drf-nested-routers библиотеку. Отправил ответ.

Ответ №1:

Вы можете переопределить get_queryset() метод.

models.py

 class Post(models.Model):
    ...

class Comment(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    ...
  

urls.py

 urlpatterns = [
    ...
    path('post/<int:post_id>/comments', CreateReadCommentView.as_view({'post': 'create', 'get': 'list'})),
]
  

views.py

 class CreateReadCommentView (ModelViewSet):
    serializer_class = CommentSerializer
    permission_classes = [IsAuthenticated]
    queryset = Comment.objects.all()

    def perform_create(self, serializer):
        serializer.save(author=self.request.user)

    def get_queryset(self):
        return super().get_queryset().filter(post=self.kwargs.get('post_id'))