‘<=' не поддерживается между экземплярами 'float' и 'QuerySet'

#python #django

#python #django

Вопрос:

Я хочу сделать вычитание между total (его в model.py ) и баланс счета. Итак, здесь у меня есть порядок Model.py :

 class Order(models.Model):
    product = models.ForeignKey(
        Product, on_delete=models.CASCADE, related_name="product")
    customer = models.ForeignKey(Customer, on_delete=models.CASCADE)
    quantity = models.IntegerField(default=1)
    fname = models.CharField(max_length=100, null=True)
    address = models.CharField(max_length=1000, null=True)
    phone = models.CharField(max_length=12, null=True)
    price = models.IntegerField()
    date = models.DateField(datetime.datetime.today, null=True)
    status = models.ForeignKey(
        Status, on_delete=models.CASCADE, blank=True, null=True)
    payment_method = models.ForeignKey(
        PaymentMethod, on_delete=models.CASCADE, blank=True, null=True)

    total = models.IntegerField(null=True)

    def save(self, *args, **kwargs):
        self.total = self.quantity * self.price
        return super().save(self, *args, **kwargs)
 

В этой модели у меня есть общее поле, поэтому в views.py:

 def post(self, request, *args, **kwargs):

        total = Order.objects.filter().only('total')
        print(total)
        balance = request.session['customer']['coin']
        print(balance)
        if balance <= total:
            balance = balance - total
            print(balance)
            # Customer.objects.filter(id = request.session['customer']['id']).update(coin=balance)
            customer = Customer.objects.get(
                id=request.session['customer']['id'])
            customer.coin = balance
            customer.save()
            request.session['customer']['coin'] = balance

            return HttpResponse("Remaining balance: "   str(balance))

        return HttpResponse("Insufficient Balance")
 

Я попытался получить общее поле и вычесть с балансом, но оно не работает, и я получаю эту ошибку.

Другое дело, что я хочу назначить поле total в переменной, после чего я хочу вычесть с балансом, который я показал в views.py

Пожалуйста, спасите меня

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

1. balance является a float , но total является a QuerySet из Order s…

2. Да, но я хочу вычесть общее количество заказов из баланса, как я могу этого добиться?? @WillemVanOnsem

Ответ №1:

Строка:

 total = Order.objects.filter().only('total')
 

сгенерирует a QuerySet из Order s, используя .only('total') , вы будете выбирать только значения для .total и извлекать другие позже, если это необходимо, но даже если вы будете использовать .values(…) , это все равно будет a QuerySet (то есть коллекция) значений, а не a float , и, следовательно, сравнение невозможно.

Вы можете, например, суммировать их с помощью .aggregate(…) [Django-doc]:

 from django.db.models import Sum

total = Order.objects.filter().aggregate(
    sum_total=Sum('total')
)['sum_total'] or 0 

но вам, вероятно, нужно что-то .filter(…) изменить, иначе вы получите сумму всех Order s в базе данных.

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

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