【问题标题】:Nested query with aggregated Foreign Key具有聚合外键的嵌套查询
【发布时间】:2013-07-07 08:06:52
【问题描述】:

我有两个这样的模型

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)

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

【问题讨论】:

    标签: sql django django-models django-queryset


    【解决方案1】:

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

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

    而且,你要加薪了。

    【讨论】:

    • 谢谢,很简单,而且很有效。除了没有投资的公司筹集资金(他们不在名单之外)。这是由于 Sum 返回 None 而不是 0,source
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    相关资源
    最近更新 更多