Как вызвать комментарии к постам из 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()),