给定一个对象的查询集,对于每个对象,我如何找到该对象的ForeignKey的所有对象集?

时间:2019-04-04 21:57:04

标签: python django django-models

我有:

class Teacher(models.Model):
    name = models.CharField(...)
    ...

class Student(models.Model):
    age = models.IntegerField(...)
    teacher = models.ForeignKey(Teacher, ...)
    ...

我有一个教师查询集:

teachers = Teacher.objects.filter(name="Betty")

我想在该查询集中找到与每位老师相关的所有学生,并且我需要将结果按老师分组。像这样:

{
    <Teacher: 1>: [<Student: 1>, <Student: 2>],
    <Teacher: 2>: [<Student: 3>, <Student: 4>]
}

我可以通过仅遍历teachers查询集中的每个对象并过滤学生对该教师的ForeignKey的学生来实现此目的,但这似乎确实很慢,并且需要为每个对象进行额外的DB调用。是否有任何方法可以在一个或几个数据库调用中完成此任务,理想情况下,仅保留Python而不使用SQL?

1 个答案:

答案 0 :(得分:3)

我很确定这是select_relatedprefetch_related的重点。这是select_related的说明:

  

返回一个查询集,该查询集将“遵循”外键关系,并在执行查询时选择其他相关对象数据。这可以提高性能,从而导致单个更复杂的查询,但意味着以后使用外键关系将不需要数据库查询。

所以您将执行以下操作:

teachers = Teacher.objects.filter(name="betty").prefetch_related("student_set")  # student_set OR whatever is in your related_name field