首页 > 解决方案 > Django:将两个查询合二为一

问题描述

我目前正在努力将query_1andquery_2合并为一个query_combined. 你知道如何实现这一目标吗?

query_1 = (
    Response.objects.filter(
        survey__event=12,
        survey__template=settings.SURVEY_POST_EVENT,
        answers__question__focus=QuestionFocus.FEELING_ABOUT_ATTENDING_AGAIN,
    ).filter(answers__answer="Very disappointed")
)

query_2 = (
    Response.objects.filter(
        survey__event=12,
        survey__template=settings.SURVEY_POST_EVENT,
        answers__question__focus=QuestionFocus.RECOMMENDATION_TO_FRIENDS,
    )
    .annotate(answer_num=Cast("answers__answer", IntegerField()))
    .filter(answer_num__gt=8)
)

这是解决方案:

combined_query = (
    Response.objects.filter(
        survey__event=12,
        survey__template=settings.SURVEY_POST_EVENT,
        answers__question__focus__in=[
           QuestionFocus.FEELING_ABOUT_ATTENDING_AGAIN,
           QuestionFocus.RECOMMENDATION_TO_FRIENDS,
        ],
    )
    .annotate(
        answer_NPS=Case(
            When(
                answers__question__type=QuestionType.NPS,
                then=Cast(
                    'answers__answer', output_field=IntegerField()
                )
            )
        )
    )
    .filter(
        answers__choices__answer="Very disappointed",
        answer_NPS__gte=9
    ).order_by("-created")
)

标签: pythondjango

解决方案


您可以使用对象的|运算符Q来组合两个查询:

from django.db.models import Q

query_combined = (
    Response.objects.filter(
        survey__event=12,
        survey__template=settings.SURVEY_POST_EVENT
    )
    .annotate(answer_num=Cast("answers__answer", IntegerField()))
    .filter(
        Q(
            answers__question__focus=QuestionFocus.FEELING_ABOUT_ATTENDING_AGAIN,
            answers__answer="Very disappointed"
        ) |
        Q(
            answers__question__focus=QuestionFocus.RECOMMENDATION_TO_FRIENDS,
            answer_num__gt=8
        )
    )
)

推荐阅读