2016-02-25 70 views
1

我有我需要渲染的「帖子」列表。對於每篇文章,我必須執行三個過濾器查詢集合,或將它們組合在一起,然後計算對象的數量。這是否合理?什麼因素可能會使這種緩慢?`count`調用Django查詢集有多昂貴?

這大致是我的代碼:

def viewable_posts(request, post): 

    private_posts = post.replies.filter(permissions=Post.PRIVATE, author_profile=request.user.user_profile).order_by('-modified_date') 
    community_posts = post.replies.filter(permissions=Post.COMMUNITY, author_profile__in=request.user.user_profile.following.all()).order_by('-modified_date') 
    public_posts = post.replies.filter(permissions=Post.PUBLIC).order_by('-modified_date') 

    mixed_posts = private_posts | community_posts | public_posts 

    return mixed_posts 

def viewable_posts_count(request, post): 

    return viewable_posts(request, post).count() 
+0

請張貼一些代碼:模型,查詢。 「慢」是一個索引,到數據庫往返的問題,從數據庫到網絡服務器的數據量有多少等。這是非常具體的 –

+0

錯誤,我大致添加了視圖代碼。我認爲這個模型非常明顯。 – personjerry

回答

0

我所能看到的最大的因素是,你必須對每個崗位的篩選器操作。如果可能,您應該在一個查詢中查詢與每個帖子相關的結果。從count開始,它是從查詢中獲得結果數量的最有效方式,所以它可能不是問題。

+0

如果我或查詢在我執行查詢之前設置,那麼這是否算作一個查詢? – personjerry

-1

試試下面的代碼:

def viewable_posts(request, post): 

    private_posts = post.replies.filter(permissions=Post.PRIVATE, author_profile=request.user.user_profile).values_list('id',flat=True) 
    community_posts = post.replies.filter(permissions=Post.COMMUNITY, author_profile__in=request.user.user_profile.following.values_list('id',flat=True) 
    public_posts = post.replies.filter(permissions=Post.PUBLIC).values_list('id',flat=True) 

    Lposts_id = private_posts 
    Lposts_id.extend(community_posts) 
    Lposts_id.extend(public_posts) 

    viewable_posts = post.filter(id__in=Lposts_id).order_by('-modified_date') 
    viewable_posts_count = post.filter(id__in=Lposts_id).count() 

    return viewable_posts,viewable_posts_count 

應該完善以下幾件事:

  1. ORDER_BY一次,而不是三次
  2. 計數方法上查詢運行只索引字段
  3. django使用帶有「值」的更快過濾器,用於計數和過濾。
  4. 取決於您的數據庫,該數據庫自身的高速緩存可以挑選viewable_posts最後質疑的帖子,並將其用於viewable_posts_count

事實上,如果你能擠進前三的過濾器查詢爲一體,你會節省時間以及。