Django model_name.item.add(item)将item添加到模型中的所有记录中
我试图实现一个与Django电子商务网站的订单系统。我有订单模型和订单项目模型Django model_name.item.add(item)将item添加到模型中的所有记录中,django,django-models,django-views,Django,Django Models,Django Views,我试图实现一个与Django电子商务网站的订单系统。我有订单模型和订单项目模型 class OrderItem(models.Model): product = models.ForeignKey(Product, on_delete=models.SET_NULL, null=True) is_ordered = models.BooleanField(default=False) owner = models.ForeignKey(User, on_delete=mo
class OrderItem(models.Model):
product = models.ForeignKey(Product, on_delete=models.SET_NULL, null=True)
is_ordered = models.BooleanField(default=False)
owner = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
date_added = models.DateTimeField(auto_now=True)
date_ordered = models.DateTimeField(null = True)
def __str__(self):
return self.product.name
class Order(models.Model):
ref_code = models.UUIDField(default=uuid.uuid4, editable=False)
items = models.ManyToManyField(OrderItem)
owner = models.ForeignKey(Profile, on_delete=models.SET_NULL, null=True)
is_ordered = models.BooleanField(default=True)
date_ordered = models.DateTimeField(auto_now=True)
shipping = models.ForeignKey(AddressAndInfo, on_delete=models.SET_NULL, null=True)
is_shipped = models.BooleanField(default=False)
price = models.FloatField(default=0.0)
我的观点是这样的:
def checkout(request):
order_items = OrderItem.objects.filter(
owner=request.user).filter(is_ordered=False).all()
address = AddressAndInfo.objects.filter(user=request.user).get()
if(order_items.count() > 0):
total = 0
for item in OrderItem.objects.filter(owner=request.user).filter(is_ordered=False).all():
if item.product.discounted_price > 0:
total = total + item.product.discounted_price
else:
total = total + item.product.price
order = Order.objects.create(
owner = Profile.objects.get(user= request.user.id),
shipping = address,
price = total
)
new = Order.objects.get(items = None)
print(new.ref_code)
new.items.add(OrderItem.objects.get(owner=request.user, is_ordered=False))
for item in order_items:
item.is_ordered = True
item.save()
return redirect('dash')
else:
messages.success(request, 'No item in Cart')
return redirect('index')
现在的问题是,当我尝试添加来自用户的第二个订单时,它会将第二个订单中的订单项添加到所有现有订单和订单中。结果是所有订单都有相同的订单项。当我尝试添加订单新订单时,新订单中的订单项目会添加到所有现有订单中。我对您的代码做了一些小改动,并添加了一些注释,希望这能有所帮助!:) 希望这能有所帮助!无论如何,我不确定您是否应该在
Order
类中使用items=models.ManyToManyField(OrderItem)
,因为您是说相同的ItemOrder
也可以属于许多订单?我想你要做的是一个OrderItem
只能属于一个订单,对吗?也许您可以将“订单”ForeignKey
列添加到您的OrderItem
中,如下所示:
class OrderItem(models.Model):
product = models.ForeignKey(Product, on_delete=models.SET_NULL, null=True)
order = models.ForeignKey(Order, on_delete=models.SET_NULL, null=True, related_name='items')
is_ordered = models.BooleanField(default=False)
owner = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
date_added = models.DateTimeField(auto_now=True)
date_ordered = models.DateTimeField(null = True)
def __str__(self):
return self.product.name
class Order(models.Model):
ref_code = models.UUIDField(default=uuid.uuid4, editable=False)
owner = models.ForeignKey(Profile, on_delete=models.SET_NULL, null=True)
is_ordered = models.BooleanField(default=True)
date_ordered = models.DateTimeField(auto_now=True)
shipping = models.ForeignKey(AddressAndInfo, on_delete=models.SET_NULL, null=True)
is_shipped = models.BooleanField(default=False)
price = models.FloatField(default=0.0)
如果您这样做,那么您所要做的全部更改就是在更新订单的最后一个循环中将订单分配给您的订单项
for item in order_items:
item.is_ordered = True
item.order = order
item.save()
现在数据库级别中只有一个订单的OrderItems:)但是我试图在cart to Order模型中只设置订单项。我的代码用于将购物车中的项目添加到所有现有记录中。另一方面,此代码仅添加一个带有订单项目的订单。我的应用程序要求用户可以在一个订单中订购多个项目。您是否尝试过这些更改,但它在第一段代码中不断出现错误?通过我添加的第二段代码,您可以获得包含多个OrderItems的订单,可能看起来只有一个订单包含OrderItems,但这是获得模型之间一对多关系的方式。通过我添加的第二段代码,您可以获得包含多个OrderItems的订单,但这就是在Django中获得模型之间一对多关系的方式,看看这些链接,它们可以帮助您更好地理解我试图做的事情:
for item in order_items:
item.is_ordered = True
item.order = order
item.save()