Получение количества объектов, которые охватывают отношение - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь получить количество объектов, которые охватывают отношение. Каждый TestPlan содержит n случаев. Метод plan_case_count () дает мне счет. Каждый TestPlanCase содержит n шагов. Я хочу получить сумму всех шагов для всех случаев, связанных с планом. Предполагается, что метод plan_case_step_count () делает это путем перебора набора запросов и суммирования счетчиков. Но это не работает. Я получаю сообщение об ошибке:

Объект «RelatedManager» не имеет атрибута «testplanstep_set»

class TestPlan(models.Model):
    tp_title = models.CharField(max_length=200)
    tp_version = models.IntegerField()
    tp_date = models.DateField(default=timezone.now)

    def plan_case_count(self):
        """This one works"""
        return self.testplancase_set.count()

    def plan_case_step_count(self):
        """This one doesn't"""
        pcs_count = 0
        for case in self.testplancase_set:
            pcs_count += case.testplanstep_set.count()
        return pcs_count


class TestPlanCase(models.Model):
    tpc_plan = models.ForeignKey(TestPlan, on_delete=models.CASCADE)
    tpc_case = models.ForeignKey(TestCase, on_delete=models.CASCADE)
    tpc_seq_no = models.IntegerField(default=1)


class TestPlanStep(models.Model):
    tps_case =  models.ForeignKey(TestPlanCase, on_delete=models.CASCADE)
    tps_step = models.ForeignKey(TestSteps, on_delete=models.CASCADE)
    tps_ok =  models.CharField(max_length=4, choices=Choices.yes_no)
    tps_issue = models.CharField(max_length=200, blank=True)

Что я делаю не так?

1 Ответ

0 голосов
/ 18 января 2019

Пожалуйста, напишите запрос количества напрямую:

def plan_case_step_count(self):
    return TestPlanStep.objects.filter(<b>tps_case__tpc_plan=self</b>).count()

Это напишет запрос COUNT(*) в SQL напрямую с JOIN.

...