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"]