我有以下型号:
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?或者我应该重新设计我的数据库:)
答案 0 :(得分:0)
您不需要pointsadded_set
。如果我理解你的模型,这应该有效:
VideoUser.objects.filter(problem_user=False) \
.annotate(points_total=Sum('pointsadded__points__value')) \
.order_by('points_total')