Django外键反向查询报错:如何通过Quiz的Slug获取关联题目?
解决Django中通过Quiz的slug查询关联题目的错误
错误根源
Quiz.quest_set.filter(slug=url)写法有误:quest_set是Quiz实例对象的反向关联管理器,不能直接通过Quiz类调用,这就是你遇到'ReverseManyToOneDescriptor' object has no attribute 'filter'错误的原因。
两种正确实现方案
方案1:先获取Quiz实例,再取关联题目
先通过slug定位到具体的Quiz对象,再用实例的quest_set获取所有关联题目:
from django.shortcuts import get_object_or_404 def questions(request, url): # 用get_object_or_404避免slug不存在时抛出500错误 quiz = get_object_or_404(Quiz, slug=url) questions = quiz.quest_set.all() return render(request, 'quiz/questions.html', {'questions': questions})
方案2:直接从Quest模型正向过滤
利用外键的双下划线查询,直接在Quest模型中筛选关联Quiz的slug匹配的记录:
def questions(request, url): questions = Quest.objects.filter(quiz__slug=url) return render(request, 'quiz/questions.html', {'questions': questions})
模板展示示例
在quiz/questions.html中遍历题目数据:
{% for question in questions %} <div class="question-item"> <h4>{{ question.question_text }}</h4> <div class="options"> <p>1. {{ question.option_1 }}</p> <p>2. {{ question.option_2 }}</p> </div> <!-- 仅管理员可见正确答案 --> {% if user.is_staff %} <p class="correct-answer">正确答案:{{ question.corr_ans }}</p> {% endif %} </div> {% empty %} <p>该测验暂未添加题目</p> {% endfor %}
内容的提问来源于stack exchange,提问作者Syed Shehab Ali
相关产品推荐
相关产品推荐

