如何解决在Django中为每个相同的客户和产品添加数量
如果Customer1购买了例如Meat的产品,则我有3个模型,CustomerPurchaseOrderDetail,Customer和Product模型。它将保存在CustomerPurchaseOrderDetail中,并且如果Customer1添加了另一个肉类产品,而不是向数据库添加另一个记录,它只会添加数量。
这是我的views.py
def batchaddtocart(request):
userID = request.POST.get("userID")
client = Customer(id=userID)
vegetables_id = request.POST.get("id")
v = Product(id=vegetables_id)
price = request.POST.get("price")
discount = request.POST.get("discount_price")
insert,create = CustomerPurchaseOrderDetail.objects.get_or_create(
profile=client,products=v,unitprice=price,quantity=1,discounted_amount=discount,discounted_unitprice=discount,)
order_qs = CustomerPurchaseOrderDetail.objects.filter\
(
profile=client,discounted_unitprice=discount
)
for order in order_qs:
if order.profile == client and order.products == v:
insert.quantity += 1
print(insert.quantity)
insert.save()
insert.save()
这是我的模特。py
class CustomerPurchaseOrderDetail(models.Model):
profile = models.ForeignKey(Customer,on_delete=models.SET_NULL,null=True,blank=True,verbose_name="Client Account")
products = models.ForeignKey(Product,verbose_name="Product")
quantity = models.IntegerField(max_length=500,default=1)
class Product(models.Model):
product = models.CharField(max_length=500)
class Customer(models.Model):
user = models.OneToOneField(User,related_name="profile",on_delete=models.CASCADE)
firstname = models.CharField(max_length=500,blank=True)
lastname = models.CharField(max_length=500,blank=True)
contactNumber = models.CharField(max_length=500,blank=True)
email = models.CharField(max_length=500,blank=True)
我没有遇到错误,但是我想要的功能不起作用。即使将相同的产品添加到Customer1购买的清单中,它也不会增加额外的数量。
解决方法
问题出在每次调用函数时,在client = Customer(id=userID)
和v = Product(id=vegetables_id)
这行中,您正在创建新的客户和产品对象,而不是使用数据库中的现有对象。将其替换为client,created = Customer.objects.get_or_create(id=userID)
,并将其替换为产品v,v_created = Product.objects.get_or_create(id=vegetables_id)
使用get_or_create
方法时,只要至少一个参数的差异足以与任何注册值都不匹配,它将创建一个新条目。因此,例如,如果您传递的数量参数等于1,则总是在数量为2+时创建一个新条目。
您应该首先仅使用“固定”参数进行过滤,如果一无所获,请创建一个新条目。否则,只需增加数量即可。
类似这样的东西:
order = None
order_qs = CustomerPurchaseOrderDetail.objects.filter\
(
profile=client,products=v,unitprice=price,discounted_amount=discount,discounted_unitprice=discount
)
if not order_qs:
order = CustomerPurchaseOrderDetail.objects.create(
profile=client,quantity=1,discounted_unitprice=discount,)
else:
for order in order_qs:
if order.profile == client and order.products == v:
# NOTE: Please,note if you need to check your other parameters too (unityprice,discounted....)
order.quantity += 1
print(order.quantity)
order.save()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。