如何使用Django ORM关联查询获取指定ID子主题的试题、选项与答案
问题解决方法
你生成的SQL语句已经包含WHERE Answers.sub_topic_id = 2的过滤条件,正常来说不会返回所有子主题的数据,问题出在你前面获取目标subtopic id t的逻辑有漏洞:
- 你通过循环
subtopics列表匹配获取t,如果没有匹配到符合e.subtopic==subtopicnames and e.topic_id==p and e.grade_id==o条件的子主题,t会复用之前的赋值甚至未定义,导致最终过滤条件不符合预期。
1. 修复subtopic id获取逻辑
替换你原来循环找t的代码,直接用ORM查询获取目标子主题,避免手动循环的漏洞:
try: # 直接通过条件查询目标子主题 target_subtopic = Sub_Topics.objects.get(subtopic=subtopicnames, topic_id=p, grade_id=o) except Sub_Topics.DoesNotExist: # 没有匹配到子主题时,返回空结果 allques = [] else: t = target_subtopic.id # 执行后续查询逻辑
2. 优化试题查询逻辑
你当前从Answers表出发查询是可行的,但更合理的方式是从试题表Questions出发查询,避免冗余关联,代码更直观:
# 查询指定subtopic下的所有试题,同时预加载关联的选项和正确答案 ques_list = Questions.objects.filter(sub_topic_id=t).prefetch_related('options_set', 'answers_set') for ques in ques_list: # 每个试题对应的选项 opt = ques.options_set.first() # 每个试题对应的正确答案 ans = ques.answers_set.first() print(ques.question, opt.option1, opt.option2, opt.option3, opt.option4, ans.correct_ans)
3. 模型冗余字段优化建议
你的Options、Answers表中重复存储了grade、topic、sub_topic字段,这些字段都可以通过关联的question外键获取,建议删除避免后续出现数据不一致的问题。
内容的提问来源于stack exchange,提问作者Muneeba
相关产品推荐
相关产品推荐

