2

我有两个这样的模型

class Company(models.Model):
    raising = models.DecimalField()

class Investment(models.Model):
    company = models.ForeignKey(Company)
    amount  = models.DecimalField()

现在我想找到所有累计投资少于raising

如果我向 Company 添加一个动态属性,称为raised_so_far汇总投资金额,我可以执行以下操作:

Company.objects.filter(raised_so_far__lt=F('raising'))

但是过滤发生在 SQL 级别,所以这是不可能的。

到目前为止,这是我最好的尝试:

Company.objects.filter(raising__gt=Investment.objects.filter(company=F(outer_company_object)).aggregate(Sum('amount'))['amount__sum'] or 0)

如何使用父对象过滤外键的聚合?

4

1 回答 1

1

您只需要使用总投资(通过连接处理)来注释查询集,然后使用F对象进行查询以使用带注释的值(如字段)。

Company.objects.annotate(total_investments=models.Sum('investments__amount')).filter(raising__gt=models.F('total_investments'))

而且,你要加薪了。

于 2013-07-09T17:36:22.190 回答