#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
является afloat
, ноtotal
является aQuerySet
из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. Если я сделаю так, чтобы моя монета плавала в целое число, смогу ли я делать то, что хочу??