【问题标题】:Django - Filter the prefetch_related querysetDjango - 过滤 prefetch_related 查询集
【发布时间】:2019-03-16 08:35:12
【问题描述】:

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

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

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

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

谢谢

【问题讨论】:

  • 如果老师有一个主动教室和一个被动教室怎么办?
  • 你能提供这个模型吗?
  • 这里的“教室”是什么?什么定义了课堂是否活跃?
  • 不应该是Classroom 而不是Class吗?
  • @WillemVanOnsem 是的,我的错。 Guys Classroom 和 Teacher 是两个不同的应用

标签: python mysql django python-2.7 prefetch


【解决方案1】:

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

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

如果你想同时过滤classroom_set,你需要结合过滤以及.prefetch_related

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'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-22
    • 2019-04-15
    • 2011-09-29
    • 2012-06-10
    相关资源
    最近更新 更多