Как сделать Django Rest API пред вложенными комментариями? - PullRequest
0 голосов
/ 05 октября 2018

Я хочу создать модель вложенного комментария для приложения для Android, и я использую фреймворк Django Rest.Я определил две модели Post и Comment следующим образом:

class Post(models.Model):
    title = models.CharField(max_length=100)
    description = models.TextField()
    author = models.ForeignKey('CustomUser',on_delete=models.CASCADE, related_name="author")
    created_at = models.DateTimeField(auto_now=True, editable=False)
    tag = models.ForeignKey('Tag', on_delete=models.CASCADE, blank=True, null=True)

class Comment(models.Model):
    p_post = models.ForeignKey('Post', on_delete=models.CASCADE)
    description = models.TextField()
    author = models.ForeignKey('CustomUser', on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now=True, editable=False)
    p_comment_id = models.ForeignKey('self', blank=True)
    is_anon = models.BooleanField(default=False)

У меня проблема в том, что я хочу получить список комментариев к приложению, поэтому как мне с ним бороться?У меня в голове следующие моменты:

  1. Я не могу вернуть полный список комментариев, так как это будет очень длинный список
  2. Итак, как я решил ограничитьсяверните топ-5 комментариев вместе с их топ-5 дочерними комментариями.

1 Ответ

0 голосов
/ 05 октября 2018

Если вы добавите related_name к p_post:

p_post = models.ForeignKey('Post', on_delete=models.CASCADE, related_name="comments")

Вы сможете их циклически просматривать следующим образом:

for post in Post.objects.order_by('created_at').all()[0:5]:
    for comment in post.comments.order_by('created_at').all()[0:5]:
        print(comment.description) # do whatever you want with comment

Примечание: [0:5] для ограничения до верхних 5

Вы также захотите предварительно выбрать комментарии при запросе сообщений: Post.objects.prefetch_related('comments')

Редактировать:

Еще раз прочитав ваш вопрос, я вижу, что это ответ API,Я бы посмотрел в rest_framework.serializers.ModelSerializer

class CommentSerialzier(serializers.ModelSerializer):
    class Meta:
        model = Comment

class PostSerializer(serializers.ModelSerializer):
    comments = CommentSerializer(many=True)
    class Meta:
        model = Post
...