Как я могу обновить количество в корзине 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, намного чище.

Вернуться на верх