根据共享字段组合两个查询集

时间:2018-08-26 18:47:25

标签: django django-models django-queryset

我有两个看起来像这样的查询集:

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.totalproduct_first.total + product_second.total

我要查询的表格示例:

user_id  total  total_items  product    type
1        150    15           product1   week
1        180    19           product2   week

1 个答案:

答案 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将包含所有totalproduct1中的product2 sum 。如果没有product2,则仍将显示product1的总和。如果有多个 product1,则将它们汇总。