【问题标题】:How to make Django Rest API fore nested comments?如何使 Django Rest API 嵌套注释?
【发布时间】:2019-03-11 05:09:09
【问题描述】:

我想为一个 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)

我遇到的问题是如果我想在应用程序上获取 cmets 列表,那么我应该如何处理呢?我脑子里有以下几点:

  1. 我无法返回完整的 cmets 列表,因为这将是一个很长的列表
  2. 那么,我如何选择限制返回前 5 个 cmets 及其前 5 个子 cmets。

【问题讨论】:

    标签: django django-rest-framework django-views django-rest-viewsets


    【解决方案1】:

    如果您将相关名称添加到 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 名

    您还需要在查询帖子时预取 cmets: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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-12
      • 2012-08-03
      • 2012-07-05
      • 2016-01-03
      • 2017-04-25
      • 1970-01-01
      • 2013-08-11
      相关资源
      最近更新 更多