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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 05:15:01