Джанго - вопрос оптимизации - PullRequest
1 голос
/ 27 ноября 2010

Если у вас есть несколько моделей:

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.

Ответы [ 3 ]

2 голосов
/ 27 ноября 2010

Нет встроенного способа.Я написал об этой проблеме в своем блоге , в которой описан метод оптимизации доступа к обратным отношениям.

1 голос
/ 09 февраля 2011

orokusaki,

Вам просто нужно кэшировать набор запросов как переменную python

students = teacher.students.all()

А затем просто использовать студентов в ваших циклах for.

Ниже приведена ссылка на собственную документацию Django по этой конкретной проблеме: -)

http://docs.djangoproject.com/en/1.1/topics/db/optimization/#understand-cached-attributes

0 голосов
/ 27 ноября 2010

Попробуйте это возможно?

teacher = Teacher.objects.select_related().get(pk=1)

http://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.QuerySet.select_related

Я никогда не использовал select_related совместно с .all () для его результата, поэтому я не уверен, даст ли он экономию БД или нет.

...