Django ManyToManyField对象自动保存自身

问题描述 投票:0回答:1

我正在尝试使用Django创建一个电子商务网站。我将orderProducts作为购物车对象的ManyToMany字段。问题是,为什么每当我创建一个OrderProduct对象时,任何现有的Cart都会自动将orderProduct保存在自身中。这是我的模型:

class Product(models.Model):
    name = models.CharField(max_length=100)
    price = models.IntegerField(default=0)
    user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE)
    post_date = models.DateTimeField('post date:', default=timezone.now)

    def __str__(self):
        return self.name

    def add_to_cart_url(self):
        return reverse("add_to_cart", kwargs={
            'product_id' : self.pk
        })


class OrderProduct(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE)
    product = models.ForeignKey(Product,on_delete=models.CASCADE)
    quantity = models.IntegerField(default=1)

    def __str__(self):
        return self.product.name

    def delete_from_cart_url(self):
        return reverse("delete_from_cart", kwargs={
            'product_name' : self.product.name
        })


class Cart(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE)
    products = models.ManyToManyField(OrderProduct)

    def __str__(self):
        return self.user.username

这是add_to_cart函数,即使我注释了cart.products.add代码,OrderProduct仍添加到购物车。

def add_to_cart(request,product_id):
    product = get_object_or_404(Product,pk=product_id)
    order_product,created = OrderProduct.objects.get_or_create(product=product,user=request.user)
    cart_qs = Cart.objects.filter(user=request.user)
    if cart_qs.exists():
        cart = cart_qs[0]
        if cart.products.filter(product__name=product.name).exists():
            order_product.quantity += 1
            order_product.save()
        else:
            return redirect("cart")
            #cart.products.add(order_product)
        return redirect("cart")
    else:
        cart = Cart.objects.create(user=request.user)
        #cart.products.add(order_product)
        return redirect("products")

这是购物车视图

@login_required(login_url='/login/')
def cart(request):
    # order_product_list = OrderProduct.objects.order_by('-product__price')
    cart,created = Cart.objects.get_or_create(user=request.user)
    order_product_list = cart.products.all()
    order_product_list = OrderProduct.objects.order_by('-product__price')
    total = 0
    for order_product in order_product_list:
        total += order_product.product.price * order_product.quantity

    context = {
        'products' : order_product_list,
        'total' : total,
    }

    return render(request,'login/cart.html',context)
python django django-models manytomanyfield
1个回答
0
投票

对,所以您的错误在这里

order_product_list = OrderProduct.objects.order_by('-product__price')

您在其中用所有OrderProduct覆盖产品的列表,无论它们是否属于当前购物车。

而不是应该做的

order_product_list = cart.products.order_by('-product__price')
© www.soinside.com 2019 - 2024. All rights reserved.