我有三个模型:公司、 Assets 和用户。每个公司都有很多 Assets (ForeignKey),每个 Assets 都有一个用户(ForeignKey,因为一个用户可能拥有多个 Assets )。

我想运行一个查询,返回给定用户拥有 Assets 的公司列表,以及他们在每家公司拥有的 Assets 数量。

我曾尝试在 python 中执行此操作,如下所示:

companies = Company.objects.filter(asset__owner=self.request.user)
context['investments'] = [(x, Asset.objects.filter(company=x, owner=self.request.user).count()) for x in companies]

也许不出所料,这非常慢,因为一家公司可以拥有 100,000 项 Assets 。似乎这在数据库级别会更好,这导致我查看了注释和聚合,但我无处可去。有人能指出我正确的方向吗?

最佳答案

您可以使用条件进行注释:

from django.db.models import Count, Case, When, IntegerField

qs = Company.objects.filter(asset__owner=self.request.user)
qs = qs.objects.annotate(
    num_assets=Count(Case(
        When(asset__owner=self.request.user, then=1),
        output_field=IntegerField(),
    ))
)

阅读文档 conditional-aggregation

关于django - 高级 Django 查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51937959/

10-15 18:34