通过多个模型计算来自多个外键的实例

时间:2020-01-03 15:17:54

标签: python sql django python-3.x django-models

我在Django(1.11)中有这些模型:

class Provider(models.Model):
    name = models.CharField(max_length=200)

    def get_contracts_number(self, kwargs):
        total = 0
        for offer in self.offer_set.all():
            total += offer.get_contracts_number(kwargs)
        return total

class Offer(models.Model):
    name = models.CharField(max_length=200)
    provider = models.ForeignKey("Provider", on_delete=models.CASCADE)

    def get_contracts_number(self, kwargs):
        total = 0
        total += self.contract_elec_set.filter(**kwargs).count()
        total += self.contract_gas_set.filter(**kwargs).count()
        total += self.contractgastank_set.filter(**kwargs).count()
        total += self.contractboilerinstallation_set.filter(**kwargs).count()
        total += self.contractboilermaintenance_set.filter(**kwargs).count()
        total += self.contractcomble_set.filter(**kwargs).count()
        total += self.contractinsurance_set.filter(**kwargs).count()

        return total

class Contract_elec(models.Model):
    offer = models.ForeignKey(
        "Offer", on_delete=models.SET_NULL, verbose_name="Offre", null=True
    )
    date_lead = models.DateTimeField()

class Contract_gas(models.Model):
    offer = models.ForeignKey(
        "Offer", on_delete=models.SET_NULL, verbose_name="Offre", null=True
    )
    date_lead = models.DateTimeField()

依此类推(我总共有7种合同类型)。 不同的合同类型可以指向相同的报价。

当date_lead>到一个选定的日期时,我希望计算每个提供商的所有合同(包括其所有报价)。 我设法用我的两个方法get_contracts_number来做到这一点,但我认为这确实没有优化。我尝试了一些带有注释和聚合的东西,但没有太大结果。

我该怎么办? 预先感谢

0 个答案:

没有答案