2017-09-29 37 views
0

我想了解使用prefetch_related和select_related進行優化。我在博客的某個地方瞭解到,使用預取和選擇的地方之一是prefetch_related用於反向關係,select_related用於前向關係。在我的情況下,有簡歷模型和教育模型。在查詢時,教育模型具有用於反向關係的resume的FK,而不是寫入額外的_set。我需要用請求的用戶簡歷列出請求用戶的所有教育。我能做到這一點沒有這些優化技術,爲後續AttributeError:'Resume'對象沒有屬性'prefetch_related'

education_instance = Resume.objects.get(applicant=request.user).educations.all() 

當我試圖改用下面,我得到我的標題

education_instance = Resume.objects.filter(applicant=request.user).prefetch_related('educations') 

這裏所述的錯誤是我的模型

class Resume(models.Model): 
    applicant = models.OneToOneField(User, on_delete=models.CASCADE) 
    name = models.CharField(max_length=100, blank=False, null=False, help_text="Full Name") 

class Education(models.Model): 
    resume = models.ForeignKey(Resume, related_name='educations') 
    name = models.CharField(max_length=100, blank=False, null=False, help_text="Name of an institution") 

任何人都可以讓我清楚select_related和prefetch_related與簡單的外行條件?我不明白我得到

回答

2

從您提供的異常問題,您試圖調用.prefetch_related()的對象Resume,不Resume小號QuerySet

所以,請確保您運行

Resume.objects.filter(applicant=request.user).prefetch_related('educations') 

Resume.objects.get(applicant=request.user).prefetch_related('educations') 
+0

這樣我只能得到一個查詢而不是所有的 – milan

+0

@milan你是什麼意思由一個'QuerySet'? –

0

首先是通過這個[的prefetch_related文獻] [1]

[1]:https://docs.djangoproject.com/en/1.11/ref/models/querysets/#prefetch-related,那麼你會發現,你不能這樣使用它

你必須申請教育模式

education_instance = Education.objects.filter(resume__applicant == request.user).prefetch_related('resume') 

希望這會幫助你。

+1

感謝您的解決方案。我一定會看看你們所有人提到的所有鏈接。在進入該鏈接之前,我不確定我是否會進入該鏈接,因此我想問一下prefetch_related中的簡歷是什麼。教育表中的字段(fk)是? – milan

+0

yes prefetch_related中的resume是教育表中的fk。 –

1

其實你應該在這種情況下使用select_related。 據我所知,prefetch_related用於多對多關係,它使兩個查詢來檢索對象,而select_related用於正常的fk或一對一關係,並且它使用連接在一個查詢中獲取所有對象。