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

如何用Django QuerySet获取学习者针对特定测验作答的所有题目

没问题,咱们可以利用Django的ORM特性,轻松实现“获取某个学习者针对特定测验作答过的所有题目”这个需求,我给你整理了几种实用的方案:

方案一:直接通过Quiz_Question模型链式过滤

这是最简洁的方式,直接通过关联关系跨表过滤:

# 先拿到目标测验和目标学习者(示例,替换成你的实际获取逻辑)
target_quiz = Quiz.objects.get(id=1)
target_learner = User.objects.get(username="john_doe")

# 查询该学习者在这个测验下作答过的所有题目
answered_questions = Quiz_Question.objects.filter(
    quiz=target_quiz,
    learnerquestionanswer__learner=target_learner
).distinct()

这里learnerquestionanswer__learner是利用双下划线跨表查询关联关系,distinct()用来避免可能出现的重复结果(比如同一题目被多次作答的情况)。

方案二:从LearnerQuestionAnswer模型正向查询

如果你需要先获取作答记录,再提取对应的题目,也可以这么做:

# 获取该学习者针对目标测验的所有作答记录,用select_related减少数据库查询次数
answer_records = LearnerQuestionAnswer.objects.filter(
    learner=target_learner,
    quiz_question__quiz=target_quiz
).select_related('quiz_question')

# 提取对应的Quiz_Question对象
answered_questions = [record.quiz_question for record in answer_records]

select_related在这里很关键,它会一次性把关联的Quiz_Question数据查询出来,避免循环遍历记录时触发N+1次数据库查询的性能问题。

方案三:从学习者对象反向查询

如果已经持有学习者的User对象,也可以通过反向关联来查询:

# 从用户对象反向获取其所有作答记录,再过滤目标测验
answer_records = target_learner.learnerquestionanswer_set.filter(
    quiz_question__quiz=target_quiz
).select_related('quiz_question')

answered_questions = [record.quiz_question for record in answer_records]

这几种方案都能满足你的需求,你可以根据自己的代码场景选择最顺手的一种~

内容的提问来源于stack exchange,提问作者Shashishekhar Hasabnis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:38:31