如何计算外键中的项目?

时间:2018-09-20 06:29:56

标签: django django-models foreign-keys

我正在使用django开发博客应用...

这是我的模特。py

select mobile_id, region,
       least(extract(epoch from max(time) - min(time)), 0) as diff
from (select t.*,
             count(*) filter (where state = 'no_signal) over (partition by mobile_id, region order by time) as grp
      from t
     ) t
group by mobile_id, region, grp;

我想知道如何计算特定类别下的博客总数?

我想跟踪所有类别的特定计数率...

4 个答案:

答案 0 :(得分:4)

如果您要计算每个Blog的{​​{1}}的数量,我们可以在Category上做一个注释:

Category

但是(稍后指定),使用from django.db.models import Count Category.objects.annotate( num_blogs=Count('Categories') )作为相关名称是完全错误的,应该将其重命名为categories,因为这是相反的关系,在这种情况下,查询为:

blogs

结果是一个from django.db.models import Count Category.objects.annotate( num_blogs=Count('blogs') )包含所有QuerySet对象,并且每个Category对象将具有一个属性Category,该属性包含与此类别相关的博客数量

通过注释执行此操作的优点是可以避免“ N + 1 问题”:在这里,我们仍然执行 one 查询,而不执行 one < / em>查询类别,然后 n 查询获取该特定类别的博客计数。在MySQL中,查询如下所示:

num_blogs
  

注意:Python中的属性通常以小写字母开头(并在单词之间使用下划线),因此SELECT category.*, COUNT(blog.id) FROM category LEFT OUTER JOIN blog ON blog.category_id = category.id GROUP BY category.id blog_title而非category和{ {1}}

  

注意Blog_title是您赋予 reverse 关系的对象的名称,因此{{1} }应该是Category,而不是related_name

答案 1 :(得分:2)

for title in categories.objects.all():
    Blog.objects.filter(Category__Title=a.title).count()

这可以满足您的需求。

答案 2 :(得分:1)

[{"category_title":category.Title, "count":Blog.objects.filter(Category=category).count()} for category in categories.objects.all()]

这将给出带有类别标题及其对应计数的词典列表

答案 3 :(得分:-1)

您也可以使用类别模型。

Categories.objects.filter(Title="someName").Categories.all().count()