Django: как суммировать числа в django

Я хочу подсчитать общее количество продаж и отобразить общую цену, я не знаю, как написать функцию для этого. Я пробовал написать небольшую функцию для этого в models.py, но она работает так, как ожидалось. Вот что я хочу, у меня есть модель UserCourse, в которой хранятся все купленные курсы, теперь я хочу вычислить и суммировать все цены одного проданного курса.

models.py

class Course(models.Model):
    course_title = models.CharField(max_length=10000)
    slug = models.SlugField(unique=True)
    price = models.IntegerField(default=0)

class UserCourse(models.Model):
    user = models.ForeignKey(User , null = False , on_delete=models.CASCADE)
    course = models.ForeignKey(Course , null = False , on_delete=models.CASCADE)
    date = models.DateTimeField(auto_now_add=True)

а также как мне отфильтровать эти модели в views.py, чтобы я мог отобразить общую стоимость курсов, проданных определенным создателем.

class Course(models.Model):
    course_title = models.CharField(max_length=128)  # Don't make max_length too big
    slug = models.SlugField(unique=True)
    price = models.IntegerField(default=0)
    customer = models.ManyToManyField(User, through='UserCourse', on_delete=models.CASCADE)


class UserCourse(models.Model):
    user = models.ForeignKey(User, null=False, on_delete=models.CASCADE)
    course = models.ForeignKey(Course, null=False, on_delete=models.CASCADE)
    date = models.DateTimeField(auto_now_add=True)


# get courses by user filter
first_customer = User.objects.first()
first_customer_courses = first_customer.course_set.all()

# get sum of customer courses price
sum_price = sum([course.price for course in first_customer_courses])

если вы хотите отображать sum_price в представлении, вы можете установить его в view.context.

Вы можете использовать агрегатную функциональность в представлении:

from django.db.models import Sum

price_total = UserCourse.objects.filter(
        course__title="a title"
    ).aggregate(
       aggregate_price = Sum("course__price")
    )["aggregate_price"]

Чтобы разбить его на части:

Сначала мы отфильтруем все объекты UserCourse, где курс имеет название "a title"

Затем мы агрегируем их, находя сумму цен на курсы для всех курсов, отобранных фильтром

Назвав переменную в нашем выражении Sum, набор запросов теперь будет иметь именованное значение, которое мы можем получить по имени ['aggregate_price'] и присвоить price_total

Теперь вы можете передать price_total через контекст для использования в вашем шаблоне.

Вы можете указать другие фильтры, чтобы получить итоговые значения цен для разных наборов запросов. Так, если создателем является поле user в модели UserCourse, вы можете повторить процесс с user__username = "my_username" в качестве фильтра

Попробуйте этот подход, используя aggregate, где вы фильтруете все UserCourse объекты из определенного course, затем выполняете агрегацию по цене для этого course:

my_course = Course.objects.first()

total_amount_sold = UserCourse.objects.filter(
    course=my_course,
).aggregate(total_amount_sold=Sum("course__price"))["total_amount_sold"]
Вернуться на верх