Как сделать запрос, чтобы рассчитать количество, умноженное на цену, используя Django ORM - PullRequest
0 голосов
/ 03 апреля 2019

Я хотел бы знать, как получить общую цену: количество, умноженное на цену в Django ORM, и какую переменную использовать для шаблона для просмотра значения?

Сообщение успешно отправлено, но не может получить общую стоимость: это то, что у меня есть в views.py: Контекст = { "tickets": Ticket.objects.all (),

"всего": Ticket.objects.filter (приобретатель = User.objects.get (ID = request.session [ 'user_id'])) совокупный (total_cost = Sum (F ( 'цена') * F (». количество », output_field = FloatField ()) } возвратный рендер (запрос, 'first_app / translation.html', контекст)

Это в моем models.py:

from django.db import models
from django.db.models import Sum, Aggregate, F

class User(models.Model):
first_name=models.CharField(max_length=100)
last_name=models.CharField(max_length=100)
email=models.CharField(max_length=100)
password=models.CharField(max_length=100)
created_at=models.DateTimeField(auto_now_add=True)
updated_at=models.DateTimeField(auto_now=True)

class Ticket(models.Model):
venue=models.CharField(max_length=100)
quantity=models.PositiveIntegerField(default=1)
price=models.DecimalField(default=25.00, max_digits=10, decimal_places=2, 
null=True, blank=True)
loop=models.CharField(max_length=100)
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)

Как вы запрашиваете ORM, чтобы получить общее количество * цена? Должен ли этот запрос быть включен до или после того, как вы введете «билет» в контексте? Должен ли этот запрос быть добавлен в поле Ticket model? Каждый из них жестко закодирован как 25,00 $, как показано на моделях. Спасибо, я был бы очень признателен!

1 Ответ

1 голос
/ 03 апреля 2019

Есть два способа сделать это.

1) Вы можете использовать .annotate().

from django.db.models import F

tickets = Ticket.objects.all().annotate(total_price=F('total_quantity') * F('price'))

for t in tickets:
    print(t.total_price)

2) Или вы можете выполнить расчет в модельном методе:

...
def total_price(self):
    return self.total_quantity * self.price

print(Ticket.objects.all()[0].total_price)

========================================

Если вы следуете методу # 1, вы можете получить к нему доступ через контекст:

вид

...
tickets = Ticket.objects.all().annotate(total_price=F('total_quantity') * F('price'))
return render(request, 'template.html', {"tickets": tickets}

шаблон

{% for ticket in tickets %}
    ticket.total_price
{% endfor %}

Если вы следуете методу № 2

вид

...
tickets = Ticket.objects.all()
return render(request, 'template.html', {"tickets": tickets}

шаблон

{% for ticket in tickets %}
    ticket.total_price
{% endfor %}
...