Я не могу умножить два поля.Ошибка: неверный литерал для int () с основанием 10: - PullRequest
0 голосов
/ 25 мая 2019

Я пытаюсь умножить цену и количество.но что-то пошло не так.«количество» и «цена» - это IntegerField ()

class BillListSum(generics.GenericAPIView):

    def get(self, request):
        bill = Bill.objects.all()
        serializer = BillSerializer(bill)
        all_sum = Bill.objects.all().aggregate(Sum(int('cart__drink__price')*'cart__quantity' ))['cart__drink__price__sum']
        return Response({'sum': all_sum if all_sum else 0 , 'objects': serializer.data})

Ошибка: недопустимый литерал для int () с основанием 10: «cart__drink__price» Пожалуйста, помогите мне!Большое вам спасибо.

Ответы [ 2 ]

1 голос
/ 25 мая 2019

Я думаю, вы можете попробовать вот так:

from django.db.models import <b>F, IntegerField</b>

class BillListSum(generics.GenericAPIView):
    def get(self, request):
        ...
        all_sum = Bill.objects.all().aggregate(<b>sum_price</b> = Sum(<b>F('cart__drink__price')*F('cart__quantity'), output_field=IntegerField()</b>))['sum_price']

Обновлен ответ с группой по

from django.db.models import <b>F, IntegerField, ExpressionWrapper</b>

class BillListSum(generics.GenericAPIView):
    def get(self, request):
        bill = Bill.objects.all().annotate(<b>total_price</b> = ExpressionWrapper(<b>F('cart__drink__price')*F('cart__quantity'), output_field=IntegerField()</b>))<b>.order_by('total_price')</b>
        serializer = BillSerializer(bill)
        all_sum = bill.aggregate(sum_price=Sum(F('total_price'))).get('sum_price')
        # rest of the code
0 голосов
/ 25 мая 2019

Это именно то, что вам нужно.

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

class BillListSum(generics.GenericAPIView):

    def get(self, request):
        bill = Bill.objects.all()
        serializer = BillSerializer(bill)
        all_sum = Bill.objects.all().aggregate(val=Sum(F('cart__drink__price')*F('cart__quantity')))['val']
        print(all_sum) # returns int

        print(connection.queries) # This will return queries performed in your views. make monitoring using this.

        return Response({'sum': all_sum if all_sum else 0 , 'objects': serializer.data})

Если вы хотите использовать SQL GROUP BY, вам следует использовать метод annotate() Manager/QuerySet. также проверьте документы об агрегации. Все в деталях.

...