我有三个模型:公司、资产和用户。每家公司都有许多资产(ForeignKey),每个资产都有一个用户(ForeignKey,因为一个用户可能拥有多个资产)。
我想运行一个查询,返回给定用户拥有资产的公司列表,以及他们在每个公司拥有的资产数量。
我尝试过用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]
也许并不令人惊讶的是,这是令人难以置信的缓慢,因为一家公司可以拥有10万资产。似乎在数据库级别上做这件事会更好,这导致我开始考虑注释和聚合,但我什么也做不到。谁能给我指个方向?
发布于 2018-08-21 04:39:41
您可以使用condition进行注释:
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(),
))
)
https://stackoverflow.com/questions/51937959
复制相似问题