我正在尝试使用prefetch_related的新Prefetch选项来进一步过滤数据库查询。使用调试工具栏我可以看到prefetch_related正在完成正确数量的查询。但是,其中一个查询应该过滤到当前用户,我可以看到它不是。
以下代码的目标是显示章节列表。每章都要展示它的课程。对于每节课,显示登录用户的状态(完整/不完整)。
看似不起作用的代码位于视图中(设置“章节”值)。
型号:
class Chapter(models.Model):
status = models.IntegerField(choices=STATUS_CHOICES, default=1)
name = models.CharField(max_length=100)
slug = AutoSlugField(populate_from='name')
desc = models.TextField()
class Lesson(models.Model):
name = models.CharField(max_length=100)
chapter = models.ForeignKey(Chapter, related_name=‘les_chapter’)
class LessonStatus(models.Model):
status = models.IntegerField(choices=STATUS_CHOICES, default=1)
lesson = models.ForeignKey(Lesson, related_name="status_lesson")
student = models.ForeignKey(User)
chapter = models.ForeignKey(Chapter, related_name=“status_chapter")
查看
def chapter_list(request, course_slug):
course = Course.objects.get(slug=course_slug)
chapters = Chapter.objects.filter(course=course).prefetch_related(
Prefetch('status_chapter__lesson__chapter', queryset=LessonStatus.objects.filter(student=request.user)),
)
return TemplateResponse(request,
'course/chapter_list_parent.html',
{'chapters': chapters, 'course': course,}
)
模板
<div id="chapters">
{% for ch in chapters %}
<p>{{ ch.name }}</p>
{% for le in ch.status_chapter.all %}
<p>lesson status: {{ le.status }}</p>
<p>lesson name: {{ le.lesson.name }}</p>
{% endfor %}
{% endfor %}
</div>
当我运行此代码时,LessonStatus不会被student = request.user过滤。相反,它只是获取所有LessonStatus记录,包括那些适用于其他用户的记录。
答案 0 :(得分:0)
找到解决方案。我错误地构造了'chapter的查询集。这是最终有效的方法:
chapters = Chapter.objects.filter(course=course).prefetch_related(
Prefetch('recchapter', queryset=LessonRec.objects.filter(student=student).select_related('lesson').order_by('lesson')),
)