2017-06-19 33 views
0

Django的ORM次數羣,我有以下型號:的問題

class Referral(models.Model): 
    referrer = models.ForeignKey(Profile, related_name='referral_made') 
    recipient = models.ForeignKey(
     Profile, related_name='referral_received') 
    created_at = models.DateTimeField(auto_now=True) 

我需要按推薦人數每個收件人

此查詢的工作:

Referral.objects.values('recipient_id').annotate(total_referral=Count('recipient_id')).order_by('-total_referral') 

和輸出是

[{ 'total_referral':5 'recipient_id':929},{ 'total_referral':1, 'recipient_id':143}]

的問題是,我需要查詢對象供以後使用

如果我刪除「.values('recipient_id')」我得到分離的記錄,並沒有分組。

Referral.objects.annotate(total_referral=Count('recipient_id')).order_by('-total_referral') 

[推薦:推薦對象,推薦:推薦對象,推薦: 推薦對象,推薦:推薦對象,推薦:推薦 對象,推薦:推薦對象]

我有做了很多搜索和測試一些答案,但無法設法得到查詢對象的結果

有什麼想法?

+0

你需要什麼樣的查詢集對象? '引用'查詢集對象或'Profile'查詢集對象? –

+0

另外,你在什麼版本的Django ORM? –

+0

'Referral' queryset only 編輯:我正在使用Django 1.8 –

回答

1

應該可以使用reverse relationships來實現您正在嘗試執行的操作。既然你已經在recipient鍵使用的related_name,讓我們假設你用下面的查詢集啓動:

profiles = Profile.objects.prefetch_related('referral_received').all() 

當你遍歷這個查詢集,通過該配置文件中收到的參照將提供每個對象(不加任何額外的查詢,因爲我們使用上述prefetch_related),像這樣:

groups = [] 
for each_profile in profiles: 
    group_qs = each_profile.referral_received.all() 
    groups.append({ 
     "recipient_id": each_profile.id, 
     "total_referral": len(group_qs), 
     "queryset": group_qs, 
    }) 

請注意,如果你不使用prefetch_related,然後一個單獨的查詢將在每次循環迭代內發射,這將最終花費您需要一定的I/O等待時間,具體取決於配置文件的數量。

儘管這種方法避開了數據庫層分組而偏向於使用python進行分組,但好消息是,您仍然可以使用單個數據庫查詢來完成此操作。

+0

您的解決方案的工作原理! 得到計數後,這裏是我做了什麼: 'A = [ { 'total_referral':1, 'recipient_id':143}, { 'total_referral':5, 'recipient_id':929} (',key = lambda x:x ['total_referral'],reverse = True): print(item)' 然後我可以從最高到最低排序。 謝謝! –