Как включить наборы запросов count и sum для моделей и представлений

#django-models #django-views

#django-модели #django-представления

Вопрос:

Я пытаюсь сложить количество билетов (count) и (sum) цену каждого купленного билета. Стоимость билета фиксирована — 25 долларов за штуку. Я использовал это в своем models.py:

 class Ticket(models.Model):
   venue=models.CharField(max_length=100)
   quantity=models.IntegerField(null=True)
   price=models.DecimalField(max_digits=10, decimal_places=2)
   loop=models.BooleanField(default=True)
   purchaser = models.ForeignKey(User, related_name="purchases", 
   on_delete=models.PROTECT)
   created_at=models.DateTimeField(auto_now_add=True)
   updated_at=models.DateTimeField(auto_now=True)
  

Я в замешательстве, где выполнять наборы запросов, чтобы получить общее количество билетов и суммирование цен? Было бы

 total_price=Ticket.objects.all().aggregate(Sum('price'))
ticket_count = Tickets.objects.count()
  

Будут ли вышеуказанные переменные (например, total_price и _ticket_count) включены в качестве столбцов в моделях или это должно быть указано только в представлениях? Может ли количество совпадать с count? Большое вам спасибо!

Комментарии:

1. Я думаю, вы сохраняете количество билетов, купленных пользователем, в количестве?

2. Привет, Атул, это правильно. Я хотел сохранить количество или, в данном случае, «количество» билетов, умноженное на фиксированную цену в 25 долларов. Я также хотел посмотреть, могу ли я добавить к этому налоги. Я попытался добавить поле налогов как 0.0725. Не могли бы вы, пожалуйста, посоветовать, как выполнить запрос к нему? Я добавил: @property def total (self): q = self.цена * self.количество t = q * 0.0725 TotalPrice = t self.цена возвращает TotalPrice в модели Ticket, но безрезультатно. Спасибо за ваш ответ, мы будем очень признательны за ваше мнение!

Ответ №1:

Подробнее о aggregate

 from django.db.models import Sum

# This will give total tickets sold to all the user 
total_tickets = Ticket.objects.aggregate(Sum('quantity'))
total_cost = total_tickets * 25
  

Комментарии:

1. Спасибо Atul за ваш ответ. Это должно быть включено прямо под моделью билета или представлениями? Я пытался это сделать, и это не сработало. Я попробовал этот запрос: «total»:Ticket.objects.filter(purchaser=User.objects.get(id=request.session[‘user_id’])).aggregate(total_cost=Sum(F(‘price’)*F(‘quantity’) output_field=FloatField()) в views.py но это недопустимый synthax. К вашему сведению, я включил—default = 25.00 в поле price — будут ли они правильными? БОЛЬШОЕ вам спасибо!

2. В представлениях вам нужно сделать это.