Python Django ManyToManyField对象自动保存自身

Python Django ManyToManyField对象自动保存自身,python,django,django-models,manytomanyfield,Python,Django,Django Models,Manytomanyfield,我试图创建一个电子商务网站使用Django。我将orderProducts作为Cart对象的多个字段。问题是,为什么每当我创建OrderProduct对象时,任何现有购物车都会自动将OrderProduct保存在自身中。这是我的模型: class Product(models.Model): name = models.CharField(max_length=100) price = models.IntegerField(default=0) user = model

我试图创建一个电子商务网站使用Django。我将orderProducts作为Cart对象的多个字段。问题是,为什么每当我创建OrderProduct对象时,任何现有购物车都会自动将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仍然添加到cart中

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)

好吧,你的虫子在这里

order\u product\u list=OrderProduct.objects.order\u by('-product\u price'))
在那里,您可以使用所有
OrderProduct
覆盖产品列表,而不管它们是否属于当前购物车

相反,你应该这样做

order\u product\u list=cart.products.order\u by('-product\u price'))

您确定您没有陷入
if cart.products.filter(product\uu name=product.name).exists()的情况下:
这是真的,因为之前存在数据?顺便说一句,请注意,在该分支中,您有一个并发问题,请看一下如何正确执行+1更新。我在数据库中OrderProduct为空的情况下尝试了几次,然后请显示您的购物车视图。也许bug就在那里嗨,我刚刚添加了我的购物车视图,非常感谢您的帮助。我一看购物车,这一行就引起了我的注意。我正要说我可能已经解决了那里的问题,非常感谢你的帮助。