如何用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
相关产品推荐
相关产品推荐

