2017-10-20 142 views
1

我正在研究一個django web應用程序,我正在通過使用prefetch_relatedselect_related方法來最小化單個數據庫命中的數量,我在我的User模型中使用了某種方法,來自它的幾個不同的相關對象。prefetch_related認證用戶

def get_profile_info(self): 
    *fetch data from a couple of models* 

然後我在我的view中使用這種方法。

def profile(request): 
    profile_info = request.user.get_profile_info() 
    *rest of the view* 

的問題是,因爲request.user不正常的查詢方法檢索,我沒有得到使用prefetch_relatedselect_related與拉動用戶一起,我無法找到任何方式來檢索相關數據以及該用戶的模型。

有沒有辦法可以覆蓋檢索用戶模型,以便我可以運行prefetch_relatedselect_related方法?

+0

'問題是,因爲request.user沒有被普通的查詢方法檢索到,'你能解釋一下嗎? –

+0

通常,要檢索Django模型,可以創建如下查詢: Model.objects.get(* query *) 而對於request.user,只需在視圖中調用request.user時獲取User模型。 而'prefetch_related'和'select_related'可用於模型的.objects方法。 – YoungVenus

回答

1

您可以隨時使用select_relatedprefetch_related從數據庫中重新提取用戶。如果select_relatedprefetch_related保存了很多查詢,那麼值得額外查詢來獲取用戶。

def profile(request): 
    user = User.objects.select_related(
     ... 
    ).prefetch_related(
     ... 
    ).get(pk=request.user.pk) 

請注意,根據視圖,prefetch_related在這種情況下可能不是很有用。它會爲每個模型添加一個額外的查詢,因此當您爲整個查詢集而不是單個對象提取相關對象時,它非常有用。

+0

這就是我正在考慮做的,但它只是感覺錯了,我覺得會有一個更有效的方式:( – YoungVenus