В Django, как я могу фильтровать, основываясь на всех сущностях в отношении «многие ко многим» вместо любых? - PullRequest
4 голосов
/ 04 октября 2009

У меня есть такая модель:

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"?

1 Ответ

4 голосов
/ 05 октября 2009

По первому вопросу - «все задачи, все предпосылки которых выполнены»:

>>> Task.objects.exclude(prerequisites__status__in=['A','P','F'])

Это также будет включать задачи без предварительных условий (так как они не имеют неполных предварительных условий). В качестве doctest (используя определение вашей модели), следующие этапы:

>>> a = Task.objects.create(status='C')
>>> b = Task.objects.create(status='A')
>>> b.prerequisites.add(a)
>>> c = Task.objects.create(status='P')
>>> c.prerequisites.add(b)
>>> prerequisites_complete = Task.objects.exclude(prerequisites__status__in=['A','P','F'])
>>> set([t.id for t in prerequisites_complete]) == set([a.id, b.id])
True

Это не отвечает на количество незавершенных предпосылок, которые есть у каждой задачи - которые вам могут понадобиться для отображения, оптимизации и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...