Запрос объектов, связанных с потоками

У меня есть две модели: WorkflowStep и WorkflowStepPR. (PR означает предварительное условие).

class WorkflowStep(BaseModel):
    name = models.CharField(max_length=200)
    workflow = models.ForeignKey('Workflow', on_delete=models.CASCADE)
    allowed_status = models.ManyToManyField('WorkflowStepStatus', related_name='workflow_step')
    default_status = models.ForeignKey('WorkflowStepStatus', blank=True, null=True, on_delete=models.SET_NULL)
    recheck_on_new_version = models.BooleanField(default=False)
    watch_folder = models.BooleanField(default=False)

    def __str__(self):
        return self.name

    class Meta:
        ordering = ['created_on'] 

class WorkflowStepPR(BaseModel):
    PR_for = models.ForeignKey('WorkflowStep', related_name='PR_for', on_delete=models.CASCADE)
    PR_step = models.ForeignKey('WorkflowStep', related_name='as_PR_step', on_delete=models.CASCADE)
    PR_step_status = models.ForeignKey('WorkflowStepStatus', on_delete=models.CASCADE)

    def __str__(self):
        return "{} 's PR - {}".format(self.PR_for, self.PR_for.workflow)

    class Meta:
        ordering = ['created_on']

Каждый WorkflowStep имеет предварительное условие, которое поддерживается через модель WorkflowStepPR. Теперь предположим, что у меня есть следующий сценарий:

enter image description here

Каждый квадрат представляет собой этап рабочего процесса. Каждая стрелка, соединяющая два поля, показывает связь пререквизита (т.е. поле справа от стрелки зависит от поля слева от стрелки). Например: "B" является предварительным условием для "C" и "D".

Я хочу найти все шаги, которые прямо или косвенно связаны с шагом B.

Прямое отношение : C, D Косвенно связанные: E (связано с C), G (связано с C), H (связано с D), J (связано с H)

Как написать запрос, чтобы получить это?

Я пробовал следующее

@receiver(pre_save, sender=WorkflowInstanceStep)
def status_of_workflowInstanceStep_updated(sender, instance,**kwargs):
    if instance.id is None:
        pass

    else:
        workflow_step = instance.workflow_step
        dependent_steps = workflow_step.as_PR_step.all()
        print(dependent_steps)

Но это возвращает только шаг C и шаг D в наборе запросов.

Вернуться на верх