簡體   English   中英

如何更新 django 購物車中的數量?

[英]How can i update quantity in the django cart?

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'

如果此購物車中存在商品,我正在嘗試購物車,系統應更新其數量,如果沒有,則應在購物車中創建新商品,我該怎么做?

您正在嘗試將數量字段更新為查詢集,而不是 object。 如果您需要獲得 object,請使用“.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()

應該足夠了,您不需要檢查 object 是否存在,因為即使元素數量肯定為零, QuerySet也是可迭代的。 基本上這意味着forloop在迭代OrderItem實例時不會引發異常。

正如已經指出的那樣,您正在嘗試設置 QuerySet 而不是 object 的屬性。 您可以使用.update() function 和F()表達式和一行來更改查詢集中的所有對象:

from django.db.models import F

OrderItem.objects.filter(product=product).update(quantity=F('quantity')+1)

您無需檢查它們是否存在或使用 for 循環,更簡潔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM