Django按计算字段对记录进行排序

时间:2017-03-13 19:55:02

标签: python django sorting

我有一个模特:

class Person(models.Model):
    score1 = models.FloatField(default=0)
    score2 = models.FloatField(default=0)
    score3 = models.FloatField(default=0)

我需要按平均分数(即(score1 + score2 + score3)/3)按降序对记录进行排序。

对于以下Person s列表:

p1 = Person(score1=3, score2=4, score3=5) # avg = 4
p2 = Person(score1=3, score2=2, score3=1) # avg = 2

结果应该是:

[<p2>, <p1>]

1 个答案:

答案 0 :(得分:2)

您可以使用F表达式以平均分数注释每一行:

from django.db.models import F

ps_with_avg = Person.objects.annotate(
    avg=(F('score1')+F('score2')+F('score3'))/3
)

然后按照平均分数对它们进行排序:

ordered_ps = ps_with_avg.order_by('-avg')

检查生成的SQL以验证它是否符合您的要求:

print(ordered_ps.query)