Django - 过滤 prefetch_related 查询集

Ank*_*ngh 4 python mysql django prefetch python-2.7

我试图通过执行以下操作来降低我的复杂性。我正在努力让所有老师都进入活跃的课堂。

teacher/models.py:

Teacher(models.Model):
    name = models.CharField(max_length=300)


classroom/models.py:

Classroom(models.Model):
    name = models.CharField(max_length=300)
    teacher = models.ForeignKey(Teacher)
    students = models.ManyToManyField(Student)
    status = models.CharField(max_length=50)

admin/views.py

teachers = Teacher.objects.prefetch_related(Prefetch('classroom_set',queryset=Classroom.objects.filter(status='Active'))


for teacher in teachers:
    classrooms = teacher.all()
    # run functions
Run Code Online (Sandbox Code Playgroud)

通过这样做,我让老师们有了教室。但它也会返回没有我不想要的活跃教室(空列表)的教师。正因为如此,我不得不用空的classroom_set来循环数千名教师。有什么办法可以删除那些classroom_set是[]的老师吗?

这是我的原始问题 - 带有外键的 Django 多个查询

谢谢

Wil*_*sem 8

如果您希望所有教师至少拥有一个相关的活动班级,则不需要预取这些,您可以过滤相关对象,例如:

Teacher.objects.filter(class__status='Active').distinct()
Run Code Online (Sandbox Code Playgroud)

如果您还想过滤classroom_set,则需要结合过滤和.prefetch_related

Teacher.objects.filter(
    class__status='Active'
).prefetch_related(
    Prefetch('class_set', queryset=Class.objects.filter(status='Active'))
).distinct()
Run Code Online (Sandbox Code Playgroud)

因此,我们将在这里过滤:

SELECT DISTINCT teacher.*
FROM teacher
JOIN class on class.teacher_id = teacher.id
WHERE class.status = 'Active'
Run Code Online (Sandbox Code Playgroud)