You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Django ORM子查询优化消费者未回答问卷的查询代码?

优化Django ORM查询:用子查询替代循环筛选

你的原始Python代码(展示A)虽然能实现需求,但在数据量较大时会有明显的性能瓶颈——它需要把所有Survey和该消费者的Ballot都加载到内存,再通过循环比对筛选结果,不仅代码冗余,还浪费了数据库本身的集合运算能力。

我们可以用Django ORM的Subquery和OuterRef特性,直接实现和你给出的SQL(展示B)完全等价的高效查询,代码更简洁,性能也更好。

优化后的代码实现

首先导入需要的工具类,然后一步完成筛选:

from django.db.models import Subquery, OuterRef

# 直接筛选出消费者24未回答的所有Survey,按id排序
consumer_survey_list = Survey.objects.filter(
    id__notin=Subquery(
        Ballot.objects.filter(consumer_id=24).values('question_id')
    )
).order_by('id')

如果你已经获取了消费者实例,也可以通过模型关联来写,逻辑更直观:

from django.db.models import Subquery, OuterRef

consumer = Consumer.objects.get(pk=24)
consumer_survey_list = Survey.objects.filter(
    id__notin=Subquery(
        consumer.ballot_set.values('question_id')
    )
).order_by('id')

为什么这比原始代码更好?

  • 查询次数更少:原始代码至少需要3次数据库查询,优化后只需要1次,和你的SQL逻辑完全对齐。
  • 性能更优:所有筛选逻辑在数据库层面完成,避免了把大量数据拉到内存做循环比对,数据量越大,优势越明显。
  • 代码更简洁:去掉了冗余的列表和循环,直接用ORM表达业务逻辑,可读性更强。

内容的提问来源于stack exchange,提问作者Andrei Bratkovski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:38:52