Django课程-章节-课时网站问题:无法获取章节下的课时
解决课程-章节-课时关联查询的问题
首先你需要修正两个核心问题:
1. CourseModel 缺少 slug 字段
你的视图里用了 course__slug=slug 过滤章节,但 CourseModel 未定义 slug 字段,这会导致章节查询直接报错。先给 CourseModel 补充该字段:
# Models.py class CourseModel(models.Model): name = models.CharField(max_length=200, verbose_name="Course Name") category = models.ForeignKey(CourseCategoryModel, null=True, blank=True, on_delete=models.PROTECT, verbose_name="Course Category") slug = models.SlugField(unique=True, verbose_name="Course Slug") # 新增slug字段
2. 课时的过滤条件写法
你已经通过 slug 获取了当前课程的 course 实例,直接用这个实例关联过滤课时即可,同时建议按章节顺序、课时顺序排序,让内容展示更规整:
# View.py def detail(request, slug): course = CourseModel.objects.get(slug=slug) # 优化章节查询:直接用course实例过滤,比通过slug二次查询更高效 courseSection = CourseLessonSectionModel.objects.filter(course=course).order_by('order') # 过滤当前课程下的所有课时,并按章节顺序、课时顺序排序 courseLessons = CourseLessons.objects.filter(course=course).order_by('section__order', 'order') return render(request, "coursedetail.html", context={ "course": course, "courseLessons" : courseLessons, "courseSection" : courseSection })
如果需要在模板中按章节分组展示课时,可以利用反向关联查询(默认反向关联名为courselessons_set):
<!-- coursedetail.html 模板示例 --> {% for section in courseSection %} <h3>{{ section.name }}</h3> <ul> {% for lesson in section.courselessons_set.all|dictsort:"order" %} <li>{{ lesson.name }}</li> {% endfor %} </ul> {% endfor %}
若要优化查询性能、避免N+1问题,可以用prefetch_related预加载章节对应的课时:
# View.py 优化版 from django.db.models import Prefetch def detail(request, slug): course = CourseModel.objects.get(slug=slug) # 预加载章节及对应课时,减少数据库查询次数 courseSection = CourseLessonSectionModel.objects.filter(course=course).order_by('order').prefetch_related( Prefetch('courselessons_set', queryset=CourseLessons.objects.order_by('order')) ) return render(request, "coursedetail.html", context={ "course": course, "courseSection" : courseSection })
内容的提问来源于stack exchange,提问作者Tolga UZUN
相关产品推荐
相关产品推荐

