Django计算相关对象

iva*_*van 4 python django

如何计算Django中的相关对象(少于N个查询,其中N是对象的数量).

为了澄清,让我们说我有表一个.每连接到恰好一个.方法我试过:

A.objects.select_related().filter(attr=val)
A[i].B_set.count()
Run Code Online (Sandbox Code Playgroud)

当然,对于每个A [i]我想找出B对象的数量Django执行一个查询.

所以问题是 - 有没有办法优化它?

Ber*_*ant 11

我没有尝试执行多少查询,但Django方式应该使用annotate().例如:

from django.db.models import Count

q = A.objects.select_related('B').annotate(num_B=Count('B'))
print A[0].num_B
Run Code Online (Sandbox Code Playgroud)

  • nvm,找到答案:从django.db.models导入Count (5认同)

abc*_*cdn 6

由于 Django 2.0Count()聚合函数接受filter参数,这允许对相关对象查询集应用额外的限制。工作原理如下:

A.objects.select_related().annotate(
    total=models.Count('myrelated__pk', filter=Q(only_items='that-i-need'))
).all()
Run Code Online (Sandbox Code Playgroud)


iva*_*van 5

我必须回答我自己的问题 :) 如果 A 的对象被这样查询:

A.objects.select_related().filter(atrr=val).annotate(n_b=models.Count('B'))
Run Code Online (Sandbox Code Playgroud)

这会创建很长的查询,但至少只有一个。