Мы можем отменить значение, которое мы передаем параметру filter=
[Django-doc] :
from django.db.models import Count, Q
queryset = self.model.objects.filter(user=self.request.user).annotate(
count_videos=Count('video'),
count_completed=Count(
'video',
filter=Q(video__status__in=STATUS_LIST_COMPLETED)
),
count_failed=Count(
'video',
filter=Q(video__status__in=Video.STATUS_LIST_FAILED)
),
count_pending=Count(
'video',
<b>filter=~Q(video__status__in=Video.STATUS_LIST_PENDING_EXCLUDE)</b>
)
)
Это приведет к следующему запросу:
SELECT model.*,
<b>COUNT(</b>
CASE WHEN NOT video.status IN <i>STATUS_LIST_PENDING_EXCLUDE</i>
AND video.status IS NOT NULL
THEN video.id
ELSE NULL END
) <b>AS count_pending</b>
FROM model
LEFT OUTER JOIN video ON model.id = video.model_id
GROUP BY model.id