首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django -过滤prefetch_related查询集

Django -过滤prefetch_related查询集
EN

Stack Overflow用户
提问于 2018-10-11 09:46:19
回答 1查看 8.9K关注 0票数 8

我试图通过以下操作来降低我的复杂性。我正在努力把所有的老师都安排在活跃的教室里。

代码语言:javascript
复制
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

通过这样做,我得到了有教室的老师。但是它也返回了我不想要的没有活动教室的教师(空名单)。正因为如此,我不得不用空的classroom_set在数千名教师周围转圈。有什么办法可以把那些classroom_set是谁的老师赶走吗?

这是我最初的问题- Django multiple queries with foreign keys

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-11 09:52:33

如果希望所有教师至少有一个相关的活动类,则不需要预取这些类,可以对相关对象进行筛选,例如:

代码语言:javascript
复制
Teacher.objects.filter(class__status='Active').distinct()

如果您也想过滤classroom_set,则需要将筛选与.prefetch_related结合起来。

代码语言:javascript
复制
from django.db.models import Prefetch

Teacher.objects.filter(
    class__status='Active'
).prefetch_related(
    Prefetch('class_set', queryset=Class.objects.filter(status='Active'))
).distinct()

在这里,我们将过滤如下:

代码语言:javascript
复制
SELECT DISTINCT teacher.*
FROM teacher
JOIN class on class.teacher_id = teacher.id
WHERE class.status = 'Active'
票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52757040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档