我有:
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?
答案 0 :(得分:3)
我很确定这是select_related和prefetch_related的重点。这是select_related
的说明:
返回一个查询集,该查询集将“遵循”外键关系,并在执行查询时选择其他相关对象数据。这可以提高性能,从而导致单个更复杂的查询,但意味着以后使用外键关系将不需要数据库查询。
所以您将执行以下操作:
teachers = Teacher.objects.filter(name="betty").prefetch_related("student_set") # student_set OR whatever is in your related_name field