如何在Django中复制一个对象的数据到另一个对象?



我正在尝试创建一个电子商务网站,我在最后一步,即下订单。因此,我试图将所有购物车项目添加到我的装运模型中。但是我得到这个错误。

'QuerySet'对象没有属性'product'

这是我的模型

class Product(models.Model):
productId = models.AutoField(primary_key=True)
productName = models.CharField(max_length=200)
productDescription = models.CharField(max_length=500)
productRealPrice = models.IntegerField()
productDiscountedPrice = models.IntegerField()
productImage = models.ImageField()
productInformation = RichTextField()
productTotalQty = models.IntegerField()
alias = models.CharField(max_length=200)
url = models.CharField(max_length=200, blank=True, null=True)
class Customer(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
name = models.CharField(max_length=100, null=True, blank=True)
email = models.EmailField(max_length=100)
profileImage = models.ImageField(blank=True, null=True, default='profile.png')
phoneNumber = models.CharField(max_length=10, blank=True, null=True)
address = models.CharField(max_length=500, blank=True, null=True)

class Order(models.Model):
customer = models.ForeignKey(Customer, on_delete=models.SET_NULL, blank=True, null=True)
dateOrdered = models.DateTimeField(auto_now_add=True)
orderCompleted = models.BooleanField(default=False)
transactionId = models.AutoField(primary_key=True)

class Cart(models.Model):
product = models.ForeignKey(Product, on_delete=models.SET_NULL, blank=True, null=True)
order = models.ForeignKey(Order, on_delete=models.SET_NULL, blank=True, null=True)
quantity = models.IntegerField(default=0, blank=True, null=True)
dateAdded = models.DateTimeField(auto_now_add=True)

class Shipment(models.Model):
customer = models.ForeignKey(Customer, on_delete=models.SET_NULL, blank=True, null=True)
orderId = models.CharField(max_length=100)
products = models.ManyToManyField(Product)
orderDate = models.CharField(max_length=100)
address = models.CharField(max_length=200)
phoneNumber = models.CharField(max_length=13)

我只是删除了额外的功能,即__str__和其他。

这是views.py

def orderSuccessful(request):
number = Customer.objects.filter(user=request.user).values('phoneNumber')
fullAddress = Customer.objects.filter(user=request.user).values('address')
timeIn = time.time() * 1000  # convert current time in milliSecond
if request.method == 'POST':
order = Shipment.objects.create(customer=request.user.customer, orderId=timeIn,
orderDate=datetime.datetime.now(), address=fullAddress,
phoneNumber=number)
user = Customer.objects.get(user=request.user)
preOrder = Order.objects.filter(customer=user)
orders = Order.objects.get(customer=request.user.customer, orderCompleted=False)
items = orders.cart_set.all()  # Here is all the items of cart
for product in items:
product = Product.objects.filter(productId=items.product.productId)  # error is on this line
order.products.add(product)
Cart.objects.filter(order=preOrder).delete()
preOrder.delete()
order.save()
else:
return HttpResponse("Problem in Placing the Order")
context = {
'shipment': Shipment.objects.get(customer=request.user.customer)
}
return render(request, "Amazon/order_success.html", context)

如何解决这个错误和所有的购物车项目字段产品在Shipment模型?

你的模型一点都不一致。您的Cart对象是Product和Order之间的m:n(或m2m - many - many)关系。通常,在购物车和Product之间有一个1:n(一个购物车包含一个或多个产品)。一个购物车可能是一个订单(除非您允许每个订单有多个购物车)。订单发货通常是1:1的比例。我在你的模型中没有看到任何这些关系。

先画出你的模型并说明它们之间的关系——问问你自己,它应该是1:1,1:1:n还是m:n?后者可以通过"通过"来实现。如果您需要数量等属性,则需要模型

在本例中,我们有一个或多个客户下订单,向购物车中装入不同数量的几种产品。订单还需要运费。

顺便说一下:记住"filter()"返回一个列表。如果您正在筛选用户,这是一对一到唯一的user实例,您最好使用"get()"因为它返回一个实例。将in放入try - except或使用get_object_or_404()使其更稳定。

product = Product.objects.filter(productId=items.product.productId)

应该是这样的:

product = product.product

不用说,它已经过时了。

看起来您通过Cart的多个实例为产品制作购物车,问题是您试图访问错误的变量,当您已经拥有实例时,您也不需要再次过滤,请进行以下更改:

carts = orders.cart_set.all()  # Renamed items to carts for clarity
for cart in carts:
product = cart.product
order.products.add(product) # The name order is very misleading makes one think it is an instance of Order, actually it is an instance of Shipment

正如我在上面的评论中提到的,你的变量名有些误导,请给任何变量起有意义的名字。

最新更新