Как я могу обновить количество в корзине django?
model.py
class OrderItem(models.Model):
product = models.ForeignKey(Product,on_delete=models.CASCADE)
order = models.ForeignKey(Order, on_delete=models.CASCADE)
quantity = models.IntegerField()
date_added = models.DateTimeField(auto_now_add=True)
if request.method == "POST":
customer = request.user.customer
order ,created = Order.objects.get_or_create(customer=customer,complete=False)
id = request.POST.get('id')
product = Product.objects.get(id=id)
if OrderItem.objects.filter(product=product):
orderitem = OrderItem.objects.filter(product=product)
orderitem.quantity+=1
order.save()
else:
orderitem = OrderItem.objects.create(product=product,order=order,quantity=1)
products = Product.objects.all()
return render(request, "HTML/index.html",{'products':products})
Ошибка
QuerySet' object has no attribute 'quantity'
Я пытаюсь в корзине, если товар существует в этой корзине, система должна обновить его количество, если нет, то в корзине должен быть создан новый товар, как я могу это сделать?
Вы пытаетесь обновить поле количества в наборе запросов, а не в объекте. Если вам нужно получить объект, используйте ".get" вместо ".filter", например, так:
if OrderItem.objects.filter(product=product).exists():
orderitem = OrderItem.objects.get(product=product)
orderitem.quantity+=1
orderitem.save()
order.save()
В принципе, ответ @STACCAH_STACCAH не совсем верен, вы можете иметь несколько OrderItem
экземпляров, привязанных к продукту. Поэтому вы должны сделать это таким образом:
order_items = OrderItem.objects.filter(product=product)
for item in order_items:
item.quantity += 1
item.save()
Этого должно быть достаточно, вам не нужно проверять, существует ли объект вообще, потому что QuerySet
является итерируемым, даже если количество элементов равно нулю. В основном это означает, что forloop
не вызовет исключения при итерации по экземплярам OrderItem
.
Как уже было отмечено, вы пытаетесь установить атрибут QuerySet, а не объекта. Вы можете изменить все объекты внутри кверисета с помощью функции .update()
и выражения F()
и одной строки:
from django.db.models import F
OrderItem.objects.filter(product=product).update(quantity=F('quantity')+1)
Вам не нужно проверять, существуют ли они, или использовать цикл for, намного чище.