比方說,我有對象User
的Django的queryset的計算百分。每個User
有一個average_score
。如何根據average_score
來確定用戶的百分比(前10%,前20%等)?從Django的查詢集
如果我能夠對查詢集進行排序,理論上我可以將索引除以總數(例如總數100中的第5位是前5%),但由於我們無法對查詢集進行排序,我能做什麼這裏?
比方說,我有對象User
的Django的queryset的計算百分。每個User
有一個average_score
。如何根據average_score
來確定用戶的百分比(前10%,前20%等)?從Django的查詢集
如果我能夠對查詢集進行排序,理論上我可以將索引除以總數(例如總數100中的第5位是前5%),但由於我們無法對查詢集進行排序,我能做什麼這裏?
更新片斷考慮到可能被零除錯誤。 它得到的對象的數量與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
幾個月前工作,我有一個類似的問題來找到今年的平均交易,例如下面的腳本。希望可以幫助..
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
要小心零除!你的代碼段不會發現這個錯誤。 – Wilfried
對,我會更新片段。這應該不會發生,但 - average_score來自User對象,因此數據庫中至少有一個對象。 –
http://stackoverflow.com/questions/11360858/what-is-the-eafp-principle-in-python只是一個關於EAFP principe的SO貼子。用於Sanca的答案。更多pytonic。 – Wilfried