我有两个看起来像这样的查询集:
product_first = Reports.objects.filter(product='product1', type='week', profile__team=team).select_related('profile')
product_second = Reports.objects.filter(product='product2', type='week', profile__team=team).select_related('profile')
每个共享obj.profile.user.username
并具有其他类似属性(例如obj.total
)-我试图以基于obj.profile.user.username
的查询集结尾,但使用obj.total
为product_first.total + product_second.total
。
我要查询的表格示例:
user_id total total_items product type
1 150 15 product1 week
1 180 19 product2 week
答案 0 :(得分:1)
我们可以通过注释并在username
上分组来实现此目的:
from django.db.models import F, Sum
qs = Reports.object.filter(
product__in=['product1', 'product2'],
type='week',
profile__team=team
).values('profile_id').annotate(
username=F('profile__user__username')
the_total=Sum('total')
).order_by('profile_id', 'username')
这将产生QuerySet
个字典,每个字典包含三个键:'profile_id'
,'username'
和'the_total'
。因此对于给定的样本数据,它看起来像:
<QuerySet [{'profile_id': 1, 'username': 'foo', 'the_total': 330}]>
(给定'foo'
是具有username
的用户的id=1
)。
请注意,the_total
将包含所有total
和product1
中的product2
的 sum 。如果没有product2
,则仍将显示product1
的总和。如果有多个 product1
,则将它们汇总。