【问题标题】:Django sort posts by comments countDjango按评论数对帖子进行排序
【发布时间】:2021-10-05 01:57:20
【问题描述】:

我创建了两个 Django 模型,即 Post 和 Comment。

class Post(models.Model):
    title = models.CharField(max_length=255)
    post = models.TextField()

class Comment(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    comment = models.TextField()

我想在主页上显示所有帖子并按 cmets 计数排序。请帮助实现它。

【问题讨论】:

    标签: python django


    【解决方案1】:

    您可以使用.annotate(…) [Django-doc],然后使用.order_by(…) [Django-doc]

    from django.db.models import Count
    
    Post.objects.annotate(
        ncomment=Count('comment')
    ).order_by('-ncomment')

    由于,您可以使用.alias(…) [Django-doc] 来防止将其计算为列和ORDER BY 子句:

    from django.db.models import Count
    
    Post.objects.alias(
        ncomment=Count('comment')
    ).order_by('-ncomment')

    例如,如果您使用ListView,则使用以下命令覆盖queryset 属性:

    from django.views.generic import ListView
    
    MyListView(ListView):
        queryset = ost.objects.alias(
            ncomment=Count('comment')
        ).order_by('-ncomment')

    【讨论】:

    • 非常感谢。我还没有检查它,但我希望它会正常工作。祝你有美好的一天。
    • 我建议为注释/别名使用更具描述性的名称。但这是吹毛求疵 ;)
    • 它工作正常。如何使用 for 循环获取模板中每个帖子的评论数?例如 {% for post in posts %} {{ post.comment.count }} {% endfor %}
    • @PraveenKumar:如果您使用带有.annotate(...)(不是.alias)的变体,您可以使用{{ post.ncomment }} 渲染它。
    • 好的。我忘了。谢谢。
    【解决方案2】:

    您可以使用 Django 内置的annotation 进行计数排序。

    例如:

    from django.db.models import Count
    
    mydata = Comment.objects.annotate(count=Count('comment')).order_by('-count')
    #you can replace 'comment' with your respective fieldname.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-21
      • 1970-01-01
      相关资源
      最近更新 更多