Django - 按ForeignKey值的总和排序过滤器?

时间:2010-03-25 16:26:15

标签: django django-models

我有以下型号:

class User:
    name = models.CharField( max_length = 200 )
    problem_user = models.BooleanField(default=False)
    def points_total(self):
        points_added = PointsAdded.objects.filter(user=self)
        points_total = 0
        for point in points_added:
            points_total += point.points
        return points_total

class PointsAdded:
    points = models.IntegerField()
    user = models.ForeignKey( User )

我想返回一个用户列表,其中problem_user为False,由points_total字段排序。

我知道我需要使用注释(如described here),但我是新手并且不知道如何使用它,因为该示例与我的情况略有不同。这不起作用:

leaders = VideoUser.objects.filter(problem_user=False).pointsadded_set. \
                .annotate(points_total=Sum('points__value')) \
                .order_by('points_total')

替代似乎是在上面的表达式的annotate()部分写出我的所有points_total函数 - 这可能吗?

有没有办法实现我想用Django功能做什么,还是我必须回到SQL?或者我应该重新设计我的数据库:)

1 个答案:

答案 0 :(得分:0)

您不需要pointsadded_set。如果我理解你的模型,这应该有效:

VideoUser.objects.filter(problem_user=False) \
            .annotate(points_total=Sum('pointsadded__points__value')) \
            .order_by('points_total')