J'ai un modèle comme celui-ci:Dans Django, comment filtrer en fonction de toutes les entités dans une relation plusieurs-à-plusieurs au lieu de toutes?
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")
Je veux trouver toutes les tâches dont les conditions préalables sont tous complet. J'ai essayé:
Task.objects.filter(prerequisites__status=u"C")
Cela obtient toutes les tâches pour lesquelles aucune condition préalable est terminée. J'ai pensé que je devais peut-être utiliser une annotation, mais je ne vois pas comment appliquer un filtre sur les tâches prérequises avant d'effectuer une agrégation. Par exemple, je peux trouver le nombre de pré-requis de chaque tâche comme ceci:
Task.objects.annotate(prereq_count=Count('prerequisites'))
Mais comment puis-je annoter des tâches avec le nombre de leurs conditions qui ont un statut différent de « C »?