如何在 django 中基于公共键名合并两个查询集

问题描述 投票:0回答:1

假设我有 2 个查询集:

<Queryset [a, b, c]>
<Queryset [a, d, e]>

我怎样才能合并这两个来实现:

<Queryset [a, b, c, d, e]>

真实案例编辑:

qs_home = Match.objects.filter(competition=competition) \
    .values(name=F("home_team__name")) \
    .annotate(home_win=Sum(Case(When(home_score__gt=F('away_score'), then=1)))) \
    .annotate(home_draw=Sum(Case(When(home_score=F('away_score'), then=1)))) \
    .annotate(home_lose=Sum(Case(When(home_score__lt=F('away_score'), then=1)))) \
    .annotate(home_goal=Sum('home_score')) \
    .annotate(home_conceded=Sum('away_score')) \
    .annotate(home_point=Sum(Case(
        When(home_score__gt=F('away_score'), then=3),
        When(home_score=F('away_score'), then=1)
    ))) \
    .order_by('home_team__name')
qs_away = Match.objects.filter(competition=competition) \
    .values(name=F("away_team__name")) \
    .annotate(away_win=Sum(Case(When(away_score__gt=F('home_score'), then=1)))) \
    .annotate(away_draw=Sum(Case(When(away_score=F('home_score'), then=1)))) \
    .annotate(away_lose=Sum(Case(When(away_score__lt=F('home_score'), then=1)))) \
    .annotate(away_goal=Sum('away_score')) \
    .annotate(away_conceded=Sum('home_score')) \
    .annotate(away_point=Sum(Case(
        When(away_score__gt=F('home_score'), then=3),
        When(away_score=F('home_score'), then=1)
    ))) \
    .order_by('away_team__name')

如果我做

qs_home.union(qs_away)
qs_away
只需在
qs_home
的末尾附加来自
qs_home
的键但
qs_away

的值
python django django-queryset
1个回答
1
投票

您可以使用

union()
并通过查看您的查询集示例,您似乎也想要唯一值,因此请尝试以下操作:

q1 = Model.objects.filter(name__in=['a', 'b', 'c'])
q2 = Model.objects.filter(name__in=['a', 'd', 'e'])
combined_qs = q1.union(q2)

这将返回一个新的查询集,其中包含来自

q1
q2
的所有不同元素在您的情况下,它将是:

<QuerySet [a, b, c, d, e]>
© www.soinside.com 2019 - 2024. All rights reserved.