'How to load data from multi-level nesting object
```
when i do the School.objects.filter() query , how to load student object in single
query using School.objects.filter()
```
class School(models.Model):
name = models.CharField(max_length=50)
grade = models.ForeignKey(Grade)
class Grade(models.Model):
name = models.CharField(max_length=10)
class Student(models.Model):
name = models.CharField(max_length=50)
grade = models.ForeignKey(Grade)
when i try to load the student object using the school.objects.filter(), its load only school object, when i use select_related('grade'), its load grade object in single sql query how can i use select_related('student'), with school.objects.filter()
Solution 1:[1]
Going from Grade to Student is a reverse-ForeignKey relation, which is many-to-one, not one-to-one. You can't do this with select_related
.
I'm not absolutely sure but I think you can use prefetch_related
:
School.objects.filter(...).prefetch_related( 'grade__students')
Solution 2:[2]
you can do something like this:
schools = School.objects.filter(...).prefetch_related('grade__student_set')
for school in schools:
students_for_school = school.grade.student_set.all()
print(students_for_school)
One thing to note is that prefetch_related()
will make an additional query here, so this will require two queries
https://docs.djangoproject.com/en/4.0/ref/models/querysets/#prefetch-related
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | nigel222 |
Solution 2 | fictionalPlant |