2010-03-25 1 views
0

У меня есть следующие модели:Django - заказ фильтра на сумму значений ForeignKey?

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 ложно, заказанных points_total поля.

Я знаю, что мне нужно использовать аннотацию (как described here), но я новичок и не знаю, как ее использовать, потому что пример немного отличается от моего случая. Это не работает:

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

Альтернативой, кажется, выписывать всю мою points_total функции внутри секции аннотировать() из приведенного выше выражения - это возможно?

Есть ли способ достичь того, что я хочу делать с функциональностью Django, или я должен вернуться к SQL? Или мне нужно переконфигурировать мою базу данных :)

ответ

0

Вам не нужен pointsadded_set. Если я правильно понимаю ваши модели, это должно работать:

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

К сожалению, это создает синтаксический эффект во второй строке. Я также попытался использовать Sum ('points'), но это также дало SyntaxError. Дайте мне знать, если вы хотите получить полную трассу. – AP257

+0

Извините, оставив дополнительную точку. Попробуйте сейчас. –

+0

По-прежнему не повезло, извините :(Это дает мне «FieldError at/leaderboard/ Невозможно разрешить ключевые слова« точки »в поле. Варианты:« а затем список полей из поля «Пользователь». Похоже, он не знает он должен использовать поле PointsAdded ...? – AP257