Какой запрос API следует отправить для получения параметров графика?
У меня есть блог на django. У меня есть две модели статья и комментарий. Каждый комментарий может быть добавлен к другому. Если я отправляю API запрос localhost:8000/comments/1, я получаю комментарий с id="1" и все вложенные комментарии до третьего уровня.
json после api запроса localhost:8000/comments/ :
HTTP 200 OK
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept
[
{
"id": 9,
"text": "First comment",
"owner": "alex",
"article": 3,
"parent": null,
"reply_set": [
{
"id": 10,
"text": "Comment to comment",
"owner": "alex",
"article": 3,
"parent": 9,
"reply_set": [
{
"id": 11,
"text": "Third level nested comment",
"owner": "alex",
"article": 3,
"parent": 10
}
]
}
]
},
{
"id": 10,
"text": "Comment to comment",
"owner": "alex",
"article": 3,
"parent": 9,
"reply_set": [
{
"id": 11,
"text": "Third level nested comment",
"owner": "alex",
"article": 3,
"parent": 10,
"reply_set": [
{
"id": 12,
"text": "Forth level nested comment",
"owner": "alex",
"article": 3,
"parent": 11
}
]
}
]
},
{
"id": 11,
"text": "Third level nested comment",
"owner": "alex",
"article": 3,
"parent": 10,
"reply_set": [
{
"id": 12,
"text": "Forth level nested comment",
"owner": "alex",
"article": 3,
"parent": 11,
"reply_set": []
}
]
},
{
"id": 12,
"text": "Forth level nested comment",
"owner": "alex",
"article": 3,
"parent": 11,
"reply_set": []
}
]
Как получить комментарий третьего уровня со всеми остальными вложенными комментариями? Что нужно писать в представлениях и урлах?
Комментарий модели:
class Comment(models.Model):
date_pub = models.DateTimeField(auto_now_add=True)
text = models.TextField(blank=False)
owner = models.ForeignKey('auth.User', related_name='comments', on_delete=models.CASCADE)
article = models.ForeignKey('Article', related_name='comments', on_delete=models.CASCADE)
parent = models.ForeignKey('self', related_name='reply_set', null=True, on_delete=models.PROTECT)
class Meta:
ordering = ['date_pub']
Сериализатор комментариев:
class RecursiveSerializer(serializers.Serializer):
def to_representation(self, value):
serializer = self.parent.parent.__class__(value, context=self.context)
return serializer.data
class CommentSerializer(serializers.ModelSerializer):
owner = serializers.ReadOnlyField(source='owner.username')
reply_set = RecursiveSerializer(many=True, read_only=True)
class Meta:
model = Comment
fields = ['id', 'text', 'owner', 'article', 'parent', 'reply_set']
Просмотры комментариев
class CommentList(generics.ListCreateAPIView):
queryset = Comment.objects.all()
serializer_class = serializers.CommentSerializer
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
def perform_create(self, serializer):
serializer.save(owner=self.request.user)
class CommentDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Comment.objects.all()
serializer_class = serializers.CommentSerializer
permission_classes = [permissions.IsAuthenticatedOrReadOnly,
IsOwnerOrReadOnly]
В urlpatterns:
path('comments/', views.CommentList.as_view()), path('comments/int:pk/', views.CommentDetail.as_view())
>если ваш вопрос заключается в том, как вы можете получить все комментарии третьего уровня (без их родителей, только комментарии третьего уровня) определенного комментария первого уровня, тогда вы можете отфильтровать набор запросов следующим образом
third_level_comment = Comment.objects.filter(replay_set__replay_set__id = <the 1st level comment id>)
вы используете двойную оценку "__", чтобы подняться на уровень выше по цепочке отношений