【问题标题】:Cannot assign "2": "OrderProduct.product" must be a "Product" instance无法分配“2”:“OrderProduct.product”必须是“Product”实例
【发布时间】:2022-01-16 19:22:26
【问题描述】:

**大家好 我想在付款后将购物车项目移动到订购产品表

首先,产品是从卡片物品模型中获取的。产品编号乘以产品价格,我得到订单模型得到订单总额

我的购物车商品未移动到订单产品表我如何移动它们?

我在 /go-to-gatewey/**

收到此错误 ValueError

enter image description here

ValueError 在 /go-to-gatewey/ 无法分配“2”:“OrderProduct.product”必须是“Product”实例。 请求方法:GET 请求网址:http://127.0.0.1:8000/go-to-gatewey/ Django 版本:3.2.9 异常类型:ValueError 异常值:
无法分配“2”:“OrderProduct.product”必须是“Product”实例。 异常位置:E:\English Projects_I Do it\Second_Project\GreatKart_Persian\venv\lib\site-packages\django\db\models\fields\related_descriptors.py,第 215 行,在 set Python 可执行文件:E:\English Projects_I Do it\Second_Project\GreatKart_Persian\venv\Scripts\python.exe

支付功能:

def go_to_gateway_view(request,total=0, quantity=0):
cart_items = CartItem.objects.filter(user=request.user)
for cart_item in cart_items:
    total += (cart_item.product.price * cart_item.quantity)
    quantity += cart_item.quantity
tax = (2 * total) / 100
grand_total = total + tax
form = OrderForm(request.POST)

data = Order()
data.order_total = grand_total
data.tax = tax

# Generate order number
yr = int(datetime.date.today().strftime('%Y'))
dt = int(datetime.date.today().strftime('%d'))
mt = int(datetime.date.today().strftime('%m'))
d = datetime.date(yr, mt, dt)
current_date = d.strftime("%Y%m%d")  # Like this : 2021 03 05
order_number = current_date + str(data.id)
data.order_number = order_number
data.save()

order = Order.objects.filter(user=request.user, is_ordered=False, order_number=order_number)

 # Move the CartItems to Order Product Table
cart_items = CartItem.objects.filter(user=request.user)
for item in cart_items:
    orderProduct = OrderProduct()
    # orderProduct.order_id = order.id
    # orderProduct.payment = payment
    orderProduct.user_id = request.user.id
    orderProduct.product = item.product_id
    orderProduct.quantity = item.quantity
    orderProduct.product_price = item.product.price
    orderProduct.ordered = True
    orderProduct.save()

    # Reduce the quantity of the sold products
    product = Product.objects.get(id=item.product_id)
    product.stock -= item.quantity
    product.save()

# Clear  Cart
CartItem.objects.get(user=request.user).delete()


# خواندن مبلغ از هر جایی که مد نظر است
amount = data.order_total

# تنظیم شماره موبایل کاربر از هر جایی که مد نظر است
user_mobile_number = '09159150915'  # اختیاری

factory = bankfactories.BankFactory()

bank = factory.create()  # or factory.create(bank_models.BankType.BMI) or set identifier
bank.set_request(request)
bank.set_amount(amount)
# یو آر ال بازگشت به نرم افزار برای ادامه فرآیند
bank.set_client_callback_url('/callback-gateway/')
bank.set_mobile_number(user_mobile_number)  # اختیاری

# در صورت تمایل اتصال این رکورد به رکورد فاکتور یا هر چیزی که بعدا بتوانید ارتباط بین محصول یا خدمات را با این
# پرداخت برقرار کنید.
bank_record = bank.ready()

# هدایت کاربر به درگاه بانک
return bank.redirect_gateway()

订购模式:

class Order(models.Model):
STATUS=(
    ('New','New'),
    ('Accepted','Accepted'),
    ('Completed','Completed'),
    ('Cancelled','Cancelled'),
)

user = models.ForeignKey(Account,on_delete=models.SET_NULL,null=True,verbose_name='یوز سفارش دهنده ')
payment = models.ForeignKey(Payment,on_delete=models.SET_NULL,blank=True,null=True,verbose_name='نوع پرداخت ')
order_number =models.CharField(max_length=20,verbose_name='شماره ی سفارش ')
first_name =models.CharField(max_length=50,verbose_name='نام ')
last_name =models.CharField(max_length=50,verbose_name='نام خانوادگی ')
phone =models.CharField(max_length=15,verbose_name='همراه ')
email =models.EmailField(max_length=50,verbose_name='ایمیل ')
address_line_1 =models.CharField(max_length=50,verbose_name='آدرس اول ')
address_line_2 =models.CharField(max_length=50,blank=True,verbose_name='آدرس دوم ')
country =models.CharField(max_length=50,verbose_name='کشور ')
state =models.CharField(max_length=50,verbose_name='دولت ')
city =models.CharField(max_length=50,verbose_name=' شهر ')
order_note =models.CharField(max_length=100,blank=True,verbose_name='یادداشت سفارش ')
order_total = models.FloatField(verbose_name='جمع سفارش')
tax = models.FloatField(verbose_name='مالیات ')
status =models.CharField(max_length=10, choices=STATUS,default='New',verbose_name='وضعیت محصول ')
ip =models.CharField(blank=True,max_length=20,verbose_name='آی پی کاربر ')
is_ordered= models.BooleanField(default=False,verbose_name='سفارش داده شده است  ')
created_at =models.DateTimeField(auto_now_add=True,verbose_name='تاریخ ایجاد ')
updated_at = models.DateTimeField(auto_now=True,verbose_name='تاریخ آپدیت ')

购物车商品型号

class CartItem(models.Model):
user      =models.ForeignKey(Account,on_delete=models.CASCADE ,null=True)
product   =models.ForeignKey(Product,on_delete=models.CASCADE,verbose_name='محصول ')
variations =models.ManyToManyField(Variation,blank=True,verbose_name='تنوع محصول با کدام آیتم')
cart      =models.ForeignKey(Cart,on_delete=models.CASCADE,verbose_name='سبد خرید ',null=True)
quantity  =models.IntegerField(verbose_name='تعداد ')
is_active =models.BooleanField(default=True,verbose_name='فعال/غیرفعال ')

并订购产品型号

class   OrderProduct(models.Model):
order   = models.ForeignKey(Order,on_delete=models.CASCADE,verbose_name='سفارش ')
payment =models.ForeignKey(Payment,on_delete=models.SET_NULL, blank=True, null=True,verbose_name='نوع پرداخت ')
user =models.ForeignKey(Account,on_delete=models.CASCADE,verbose_name='یوز سفارش دهنده ')
product =models.ForeignKey(Product,on_delete=models.CASCADE,verbose_name='محصول سفارش داده ')
variation =models.ForeignKey(Variation,on_delete=models.CASCADE,verbose_name='تنوع محصول ')
color =models.CharField(max_length=50,verbose_name='رنگ محصول ')
size =models.CharField(max_length=50,verbose_name='سایز محصول ')
quantity =models.IntegerField(verbose_name='تعداد محصول ')
product_price =models.IntegerField(verbose_name='قیمت محصول ')
ordered =models.BooleanField(default=False,verbose_name='سفارش داده شده ')
created_at =models.DateTimeField(auto_now_add=True,verbose_name='تاریخ ایجاد ')
updated_at =models.DateTimeField(auto_now=True,verbose_name='تاریخ آپدیت ')

哪一部分错了? 我的购物车项目未移动到订单产品表我该如何移动它们

【问题讨论】:

    标签: python django django-models django-views


    【解决方案1】:

    从错误消息来看问题出在:

    orderProduct.product = item.product_id
    

    您的 OrderProduct 模型中看起来像:

    OrderProduct(models.Model):
       ...
       porduct = models.ForeignKey(Product, ....)
    

    这意味着你需要分配一个 Product 实例,而不是 instance->id

    您可以将 CartItem 模型更改为

    CartItem(models.Model):
       ...
       product = models.ForeignKey(Product, ....)
    

    然后在上面修改为

    orderProduct.product = item.product
    

    如果这对您没有帮助,请发布您的模型 CartItem 和 OrderProduct

    【讨论】:

    • 谢谢但没用我添加了 CartItem 和 OrderProudct
    【解决方案2】:

    如果没有看到OrderProductCartItems 类,您收到的答案可能不完整。不过,我会尽力帮助您指明正确的方向。

    问题是这一行:

        orderProduct.product = item.product_id
    

    您似乎已将您的 OrderProduct.product 成员设置为与您的 Product 类的关系。但是,item.product_id 是一个整数。

    对此有几种可能的解决方案:

    • 您可能设置了OrderProduct.product_id 字段或类似字段,它是相关表的整数ID。如果有,您可以将该字段设置为整数值item.product_id
      • 我个人会使用这种方法,因为它可以防止在处理多个请求时出现数据争用。
    • 如果您的CartItemProduct 建立了类似的关系,例如在CartItem.product 下,您可以将其分配给OrderProduct.product,而不是orderProduct.product = item.product
      • 或者,您可以使用product = Product.objects.get(id=item.product_id) 或类似名称查询相关产品的Product 表。然后,您可以尝试使用orderPRoduct.product = product 分配该对象。
      • 此方法的问题是它引入了数据竞争,并且不再增加任何保证。您可能会在一个请求中查询Product,然后另一个请求(或应用程序!)可能会从数据库中删除Product,然后您尝试保存您的orderProduct 对象,从而产生错误。
        • 如果产品不存在以及在查询时产品存在并被删除,我将在上面使用的方法都会出现完全相同的错误。最好先尝试插入,然后检查错误,而不是查询,尝试插入,然后无论如何都要检查错误。

    【讨论】:

    • 谢谢,但没用我添加了 CartItem 和 OrderProudct 请再看一遍,如果可能的话请指导
    • 看起来你的CartItem 有一个product 字段,它返回一个Product。应该可以通过orderProduct.product = item.product 获得工作结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 2018-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多