Если у вас есть несколько моделей:
class Teacher(models.Model):
name = models.CharField(max_length=50)
class Student(models.Model):
age = models.PositiveIntegerField()
teacher = models.ForeignKey(Teacher, related_name='students')
и вы используете это так:
>>> student = Student.objects.get(pk=1)
>>> student.teacher.name # This hits the database
'Some Teacher'
>>> student.teacher.name # This doesn't (``teacher`` is cached on the object)
'Some Teacher'
Это круто.Django кэширует связанный объект, чтобы вы могли использовать его снова без необходимости злоупотреблять вашей базой данных.
Но , если вы используете его так:
>>> teacher = Teacher.objects.get(pk=1)
>>> for student in teacher.students.all(): # This hits the database
... print(student.age)
...
8
6
>>> for student in teacher.students.all(): # This does too (obviously)
... print(student.age)
...
8
6
Естьнет кэширования или эффективного доступа к связанным объектам в этом направлении.
Мой вопрос, таким образом: Существует ли встроенный (или не проблемный способ) для обратного доступа к связанным объектам эффективным способом(кэшированный способ), как вы можете в примере student.teacher
выше?
Причина, по которой я этого хочу, заключается в том, что у меня есть модель с несколькими методами, которым снова и снова требуется доступ к одним и тем же связанным объектам, поэтомустраница, которая должна иметь 12 запросов, заканчивается примерно 30.