2016-09-21 152 views
0

我使用django 1.10.1,postgres 9.5和redis。 我有一個存儲用戶投票,看上去就像一個表:試圖儘量減少到數據庫投票表的次數

========================== 
object | user | created_on 
========================== 

其中objectuser分別爲外鍵自身表的id列。

問題是,在許多情況下,我必須在一個頁面中列出很多對象。如果用戶登錄或認證,我必須檢查每個對象是否被投票(並根據結果採取行動,例如show voteunvote按鈕)。所以在我的模板中,我必須爲頁面中的每個對象調用這樣的函數。

def is_obj_voted(obj_id, usr_id): 
    return ObjVotes.objects.filter(object_id=obj_id, user_id=usr_id).exists() 

因爲我可能有幾十對象在一個頁面中,我發現,使用django-debug-toolbar,因爲我訪問只是一行每個查詢單獨的數據庫訪問可能需要超過一秒,並在連續出現這種情況方式爲頁面中的所有對象。更糟的是,我在其他頁面中使用來自該表格的類似查詢(即,僅使用user或僅使用object進行過濾)。

我試圖實現什麼,我認爲這是正確的做法是找到一種方法來訪問數據庫只是一次獲取所有投票過濾的某些用戶對象(也許當用戶登錄或在需要這種數據庫訪問的第一頁命中時),然後根據頁面需求進一步將其過濾爲我想要的任何內容。由於我使用redis和django-cacheops應用程序,它可以幫助我完成這項工作嗎?

+0

你是如何得到你的object_ids請用該部分代碼更新的。 redis和django-cache在哪裏出現? – e4c5

回答

0

在你的情況我會更好地獲取對象ID數組和查詢用戶的ID和所有選票這個數組,像去:

object_ids = [o.id for o in Object.objects.filter(YOUR CONDITIONS)] 
votes = set([v.object_id for v in ObjVotes.objects.filter(object_id__in=object_ids, user_id=usr_id)] 
def is_obj_voted(obj_id, votes): 
    return obj_id in votes 

這將使只有一個額外的數據庫查詢得到用戶每頁投票。

+1

應該使用'queryset.values_list('pk',flat = True)'來高效地提取pks。 – Suor