python - Django - 过滤 prefetch_related 查询集

标签 python mysql django python-2.7 prefetch

我正在尝试通过执行以下操作来降低我的复杂性。我正在努力让所有老师都在活跃的类里面。

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

谢谢

最佳答案

如果您希望所有教师都有至少一门相关的事件类(class),则不需要预取这些,您可以过滤相关对象,例如:

Teacher.objects.filter(class__status='Active').distinct()

如果你也想过滤classroom_set,你需要结合过滤和.prefetch_related:

from django.db.models import Prefetch

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

因此,我们将在此处进行过滤:

SELECT DISTINCT teacher.*
FROM teacher
JOIN class on class.teacher_id = teacher.id
WHERE class.status = 'Active'

关于python - Django - 过滤 prefetch_related 查询集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52757040/

相关文章:

python - Python 中的静态变量继承

python - 有哪些可以相互比较的内置 Python 3 类型?

python - 从 django 迁移开始

php - For循环检索相同的mysql行

java - 我尝试连接一个外部数据库 (mySql 5.7) 以在 Liferay 7.0 中填充我的实体。但是有一个异常(exception)

django - celery 守护进程的问题

python - 使用 Djoser、django-rest-framework-jwt 和 django-rest-framework 注册后获取 token

python - Tensorflow:var.eval() 与 var.initialized_value().eval()

python - 迭代扩展列表/嵌套 for 循环

mysql - 在mysql数据库中插入时间