首页 > 解决方案 > 获取跨越关系的对象的计数

问题描述

我正在尝试计算跨越关系的对象。每个 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)

我究竟做错了什么?

标签: pythondjangodjango-models

解决方案


请直接写计数查询:

def plan_case_step_count(self):
    return TestPlanStep.objects.filter(tps_case__tpc_plan=self).count()

这将COUNT(*)直接在 SQL 中使用JOIN.


推荐阅读