使用Django的新Prefetch选项进行查询集过滤的问题

时间:2014-11-29 23:25:06

标签: django django-views

我正在尝试使用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记录,包括那些适用于其他用户的记录。

1 个答案:

答案 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')),
)