擅长:python、mysql、java
<p>Django 2.0中的<a href="https://docs.djangoproject.com/en/2.2/ref/models/conditional-expressions/#conditional-aggregation" rel="noreferrer">Conditional aggregation</a>允许您进一步减少过去的faff数量。这也将使用Postgres'<code>filter</code>逻辑,这比求和的情况要快一些(我已经看到20-30%这样的数字出现在周围)。</p>
<p>不管怎样,在你的情况下,我们正在寻找一些简单的东西:</p>
<pre><code>from django.db.models import Q, Count
events = Event.objects.annotate(
paid_participants=Count('participants', filter=Q(participants__is_paid=True))
)
</code></pre>
<p>文档中有一个关于<a href="https://docs.djangoproject.com/en/2.2/topics/db/aggregation/#filtering-on-annotations" rel="noreferrer">filtering on annotations</a>的单独部分。这和条件聚合是一样的,但更像我上面的例子。不管是哪种方式,这都比我以前做的那些烦人的子查询要健康得多。</p>