python - Django:将两个查询合二为一
问题描述
我目前正在努力将query_1
andquery_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")
)
解决方案
您可以使用对象的|
运算符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
)
)
)
推荐阅读
- azure - Azure B2C:获取自定义策略的内置声明列表
- flutter - 如何正确修复颤动中的行间距
- sql - 如何将不同类型的值从一列分配到各个列
- google-apps-script - 谷歌应用程序脚本可以识别带有“+”标签的电子邮件吗?
- r - 替换R中列表列表中的部分文本
- excel - 我必须在 Excel 中使用 MID、LEN 和 FIND 函数才能提取 url 的一部分
- boolean - 将 IPTC 分类法转换为布尔表达式
- scala - 有没有办法从用作注释的案例类中可靠地找到 arg 值?
- vb.net - 查找两个列表的匹配元素的索引
- c# - 如何在控制器动作的单元测试中传递特定的 UserContext