2010-11-27 3 views
1

Если у вас есть какая-то модель:Джанго - оптимизация вопрос

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.

ответ

2

Там ISN Нет никакого встроенного способа. Я написал об этом выпуске on my blog с техникой оптимизации обратных отношений.

+0

отлично! Каждый раз, когда я сталкиваюсь с новой проблемой, вы сталкиваетесь с той же проблемой задолго до меня. Ты похож на моего мистера Мияги, хотя по иронии судьбы, твое имя - Даниэль. Еще раз спасибо. – orokusaki 2010-11-27 19:21:36

+0

В этом случае функция select_related() не работает? – jMyles 2010-11-27 20:20:48

1

orokusaki,

Вам просто нужно кэшировать QuerySet в качестве переменного питона

students = teacher.students.all() 

А затем просто использовать студент в вашем для петель.

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

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