【问题标题】:Django one to many relationship: number of objectsDjango 一对多关系:对象数
【发布时间】:2015-01-10 16:07:58
【问题描述】:

这是我的模型:

class Story(models.Model):
    writer = models.ForeignKey(UserProfile, blank=False, null=True)
    .
    .
    .

class Comment(models.Model):
    on_story = models.ForeignKey(Story, related_name="comments", blank=False, null=False)
    .
    .
    .

如何获取与特定故事相关的 cmets 数量,并将其注入到视图中?

【问题讨论】:

    标签: python django django-models one-to-many django-queryset


    【解决方案1】:

    如果您需要多个故事的评论计数,我强烈建议您使用 annotations 而不是在每个故事上调用 comments.count()

    from django.db.models import Count
    
    stories = Story.objects.order_by("-date_published").annotate(comment_count=Count('comments'))
    

    这会将查询的数量从 N+1 减少到仅 1,使用联接在数据库中执行 COUNT,而不是为每个计数单独查询。然后可以按如下方式访问计数:

    {% for story in stories %}
        {{ story.comment_count }}
    {% endfor %}
    

    【讨论】:

      【解决方案2】:

      您可以使用QuerySet.countcomments 属性(related_name)。

      在视图函数中使用如下:

      comment_count = specific_story.comments.count()
      # do something with `comment_count`
      

      更新在模板中使用.comments.count

      {% for story in stories %}
          ... {{ story.comments.count }} ...
      {% endfor %}
      

      【讨论】:

      • 如果我这样实现我的视图: def index(request): story_list = Story.objects.order_by("-date_published") 。 . . context = {'stories': stories} return render(request, 'stories/index.html', context) 如何获取模板中各个故事的 cmets 数量?
      • @Lumsum,我在阅读您的评论后更新了答案。请检查一下。
      • 实际上,您可以在模板中调用 cmets.count。
      • @DanielRoseman,你是对的。我忘记了在模板中可以调用方法。谢谢你指出。我相应地更新了答案。
      • 我刚刚问了类似的问题 [link]:(stackoverflow.com/questions/31423523/…) 并得到了类似的答案。我发现下面的注释答案要快约 3 倍,这并不奇怪,因为视图中的查询比模板中的操作更接近 db。
      猜你喜欢
      • 1970-01-01
      • 2015-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-17
      • 2015-07-05
      • 2013-11-16
      • 2014-03-27
      相关资源
      最近更新 更多