Учитывая набор запросов объектов, для каждого, как я могу найти набор всех объектов, которые ForeignKey для этого объекта? - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть:

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 обращаются к этому учителю, но это кажется очень медленным и потребовало бы дополнительной БДвызов для каждого объекта.Есть ли способ сделать это всего за один или несколько вызовов БД, в идеале, оставаясь только на Python и не прибегая к SQL?

1 Ответ

3 голосов
/ 05 апреля 2019

Я почти уверен, что это весь смысл select_related и prefetch_related . Вот объяснение для select_related:

Возвращает QuerySet, который будет «следовать» отношениям внешнего ключа, выбирая дополнительные данные связанного объекта при выполнении своего запроса. Это повышение производительности, которое приводит к одному более сложному запросу, но означает, что дальнейшее использование отношений внешнего ключа не потребует запросов к базе данных.

Итак, вы бы сделали что-то вроде этого:

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