Django - сумма сумм нескольких полей модели - PullRequest
0 голосов
/ 22 января 2020

Как я могу сложить сумму каждой модели здесь? В конце я просто хочу иметь одно единственное значение для всех up_votes / down_votes по всем 3 моделям. Смотрите пример ниже:

def calc_user_feedback():
    users = User.objects.all()
    try:
        for user in users:
            fed_qry_up_votes = Model1.objects.filter(author=user).aggregate(Sum('up_vote')) + \
                               Model2.objects.filter(author=user).aggregate(Sum('up_vote')) + \
                               Model3.objects.filter(author=user).aggregate(Sum('up_vote'))
            fed_qry_down_votes = Model1.objects.filter(author=user).aggregate(Sum('down_vote')) + \
                               Model2.objects.filter(author=user).aggregate(Sum('down_vote')) + \
                               Model3.objects.filter(author=user).aggregate(Sum('down_vote'))

            logger.info("Overall user feedback calculated successfully.")
    except:
        logger.info("Error processing task: 'Calculate user feedback', please investigate")

1 Ответ

1 голос
/ 23 января 2020

Предполагая, что author не имеет related_name, установленного для каждой модели:

from django.db.models import F, Sum

users = (
    User.objects.annotate(up_votes_1=Sum("model1_set__up_vote"))
    .annotate(up_votes_2=Sum("model2_set__up_vote"))
    .annotate(up_votes_3=Sum("model3_set__up_vote"))
    .annotate(total=F("up_votes_1") + F("up_votes_2") + F("up_votes_3"))
)

Теперь вы можете перебирать пользователей и получать итоговые значения для каждой.

...