2017-01-02 91 views
1

比方說,我有對象User的Django的queryset的計算百分。每個User有一個average_score。如何根據average_score來確定用戶的百分比(前10%,前20%等)?從Django的查詢集

如果我能夠對查詢集進行排序,理論上我可以將索引除以總數(例如總數100中的第5位是前5%),但由於我們無法對查詢集進行排序,我能做什麼這裏?

回答

1

更新片斷考慮到可能被零除錯誤。 它得到的對象的數量與average_score較少使用__lte查詢集濾器(Less than or equal to)小於指定,並通過在數據庫中的對象的總數量除以。

一切都在數據庫端做的,(幾乎)沒有數據傳輸來回,所以它應該也能有效地與大量的用戶對象在數據庫中

queryset = User.objects.all() 
    total_count = queryset.count() 
    if total_count: 
     percentile = float(queryset.filter(average_score__lte=average_score).count())/total_count 
    else: 
     return 0.0 
+0

要小心零除!你的代碼段不會發現這個錯誤。 – Wilfried

+0

對,我會更新片段。這應該不會發生,但 - average_score來自User對象,因此數據庫中至少有一個對象。 –

+1

http://stackoverflow.com/questions/11360858/what-is-the-eafp-principle-in-python只是一個關於EAFP principe的SO貼子。用於Sanca的答案。更多pytonic。 – Wilfried

1

幾個月前工作,我有一個類似的問題來找到今年的平均交易,例如下面的腳本。希望可以幫助..

import time 
from django import template 
from yourapp.models import Transaction 

register = template.Library() 
now_year = time.strftime("%Y") 

@register.simple_tag 
def graph_average_income_by_year(): 

    try: 
     transactions = Transaction.objects.filter(paid=True)\ 
              .filter(payment_date__year=now_year) 
     count_transactions = transactions.count() 
     incomes = [ p.total_transfer for p in transactions ] 
     return ("%.1f" % (float(sum(incomes))/count_transactions)) 
    except: 
     return 0.0