2010-11-27 47 views
1

如果你有一些車型:Django的 - 優化問題

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