Как вызвать комментарии к постам из api

В настоящее время у меня есть следующие модели:

class Post(models.Model):    
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=200, blank=False, null=False)

class Comment(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE, null=False, blank=False)
    text = models.TextField(max_length=1000)

и эти ModelViewSets:

class PostViewSet(ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer

class CommentViewSet(ModelViewSet):
    queryset = Comment.objects.all()
    serializer_class = CommentSerializer

Мой вопрос в том, как я могу вызвать комментарии из поста, например, так:

GET /posts/{id}/comments

в настоящее время я получаю комментарии таким образом:

GET /comments/{id} #comment Id, not post id.

Я попробовал это и сработало:

@action(detail=True)
def comments(self, request, pk=None):
   post = self.get_object()
   comments = post.comment_set.all()
   serializer = CommentSerializer(comments, many=True)

   return Response(serializer.data)

и хорошо работал.

Первым шагом будет создание представления, В этом случае вы передадите postId в URL, этот аргумент будет доступен внутри вашего представления с помощью self.kwargs[]. get_queryset вернет кверисет, в котором вы можете написать любую логику и сериализовать его.

class MessageList(generics.ListAPIView):
    serializer_class = CommentSerializer

    def get_queryset(self):
        return Comment.objects.filter(post=self.kwargs['post_id'])

Другой get_queryset вариант - получить ваш пост и затем вернуть массы.

def get_queryset(self):
    return Post.objects.get(pk=self.kwargs['post_id']).comment_set.all()

Сопоставьте это представление с URL, обратите внимание, что имя переменной - это имя, используемое в представлении.

path('posts/<post_id>/comments/', MessageList.as_view()),
Вернуться на верх