Python Django ManyToManyField对象自动保存自身
我试图创建一个电子商务网站使用Django。我将orderProducts作为Cart对象的多个字段。问题是,为什么每当我创建OrderProduct对象时,任何现有购物车都会自动将OrderProduct保存在自身中。这是我的模型: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
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就在那里嗨,我刚刚添加了我的购物车视图,非常感谢您的帮助。我一看购物车,这一行就引起了我的注意。我正要说我可能已经解决了那里的问题,非常感谢你的帮助。