У меня есть такая модель:
class Task(models.model):
TASK_STATUS_CHOICES = (
(u"P", u'Pending'),
(u"A", u'Assigned'),
(u"C", u'Complete'),
(u"F", u'Failed')
)
status = models.CharField(max_length=2, choices=TASK_STATUS_CHOICES)
prerequisites = models.ManyToManyField('self', symmetrical=False, related_name="dependents")
Я хочу найти все задачи, предварительные условия которых все выполнены. Я пробовал:
Task.objects.filter(prerequisites__status=u"C")
Получает все задачи, для которых любая предпосылка выполнена. Я подумал, что, возможно, мне нужно использовать аннотацию, но я не вижу, как применить фильтр к обязательным задачам перед агрегацией. Например, я могу найти количество предпосылок для каждой задачи, например:
Task.objects.annotate(prereq_count=Count('prerequisites'))
Но как мне аннотировать задачи с количеством их предпосылок, которые имеют статус, не равный "C"?