2015-11-07 40 views
0

我有一個基於Django的web應用程序,用戶可以在其中互相聚集和聊天。我剛剛寫完一個功能,用戶可以創建自己的「聊天羣組」,以任何感興趣的主題爲中心。這些可能是私有公開地可見。極具挑戰性的查詢集過濾,排序和註解(在基於Django的應用程序中)

我的下一個挑戰是呈現出列表中的所有現有的公共組,分頁,並且通過排序的最熱鬧的組第一。經過深思熟慮之後,我決定發生的事情最多的組織是在先前的60分鐘中看到最獨特的訪客(無聲或其他)。可以肯定,唯一的我是指不同的用戶,而不是同一個用戶一次又一次地擊中組。

什麼的最有效的方式以獲得所需的,責令在關聯到這個流行列舉我基於類的視圖的get_queryset()方法查詢設置的?其次,什麼是效率最高的方式還可以在同一個查詢集中爲每個組對象總共不同的視圖總共不同的視圖,這樣我可以另外顯示總視圖,而根據目前什麼排序熱?


相關型號有:

class Group(models.Model): 
    topic = models.TextField(validators=[MaxLengthValidator(200)], null=True) 
    owner = models.ForeignKey(User) 
    private = models.CharField(max_length=50, default=0) 
    created_at = models.DateTimeField(auto_now_add=True) 

class GroupTraffic(models.Model): 
    visitor = models.ForeignKey(User) 
    which_group = models.ForeignKey(Group) 
    time = models.DateTimeField(auto_now_add=True) 

相關的看法是:

class GroupListView(ListView): 
    model = Group 
    form_class = GroupListForm 
    template_name = "group_list.html" 
    paginate_by = 25 

    def get_queryset(self): 
     return Group.objects.filter(private=0,date__gte=???).distinct('grouptraffic__visitor').annotate(recent_views=Count('grouptraffic__???')).order_by('-recent_views').annotate(total_views=Count('grouptraffic__which_group=group')) 

正如你所看到的,我掙扎,而浩浩蕩蕩的get_queryset(self)上述方法,標註兩次,什麼不是。請指教!

回答

1

您不能在單個django查詢中合併annotate()distinct()。所以,你可以嘗試這樣的:

date = datetime.datetime.now()-datetime.timedelta(hours=1) 

下一個查詢是唯一訪問者

得到grouptraffic
new_traff = GroupTraffic.objects.filter(time__gte=date).distinct('visitor','which_group').values_list('id',flat=True) 

trendingGrp_ids = GroupTraffic.objects.filter(id__in=new_traff).values('which_group').annotate(total=Count('which_group')).order_by('-total') 

上面的查詢將讓你走向由total訂購組識別符號,如:

[{'total': 4, 'which_group': 2}, {'total': 2, 'which_group': 1}, {'total': 1, 'which_group': 3}] 

這裏total指的是沒有。在過去的60分鐘內爲每個團隊提供新的獨特訪客。

現在遍歷trendingGrp_ids與意見,以獲得趨勢trendingGrps:

trendingGrps = [Group.objects.filter(id=grp['which_group']).extra(select={"views":grp['total']})[0] for grp in trendingGrp_ids] 

更新:

要得到所有公開的用戶組,並通過測量流量排序他們,他們是多麼熱,他們在過去1小時內收到。

new_traff = GroupTraffic.objects.filter(time__gte=date,which_group__private=0).distinct('visitor','which_group').values_list('id',flat=True) 

trendingGrp_ids = GroupTraffic.objects.filter(id__in=new_traff).values('which_group').annotate(total=Count('which_group')).order_by('-total') 

trendingGrps = [Group.objects.filter(id=grp['which_group']).extra(select={"views":grp['total']})[0] for grp in trendingGrp_ids] 

trndids = [grp['which_group'] for grp in trendingGrp_ids] 

nonTrendingGrps = Group.objects.filter(private=0).exclude(id__in=trndids).extra(select={"views":0}) 

allGrps = trendingGrps.append(nonTrendingGrps) 
+0

@hassanbaig做了我的答案爲你工作..? –

+0

到目前爲止,這麼好,因此接受它。如果將來出現一些問題,將會提出一個新的問題。謝謝! –

+0

所以它缺少的一件事就是,它沒有顯示所有的公共團體,它只顯示了最近60分鐘內趨勢的那些。我實際上需要*所有公共團體*,按照他們過去60分鐘的趨勢排序。 –

0

1)創建一個單獨的函數,在聊天箱中顯示不同的視圖。對於每個聊天室,將結果放在一個列表中。返回列表中最大的值並將其分配給一個變量。導入函數並使用變量過濾。

2)爲每個盒子設置一個集合。該集合包含chatbox的所有不同用戶。按集合的長度進行過濾。