Невозможно присвоить значение "2": "OrderProduct.product" должен быть экземпляром "Product".

** Привет всем! Я хочу переместить элементы корзины в таблицу продуктов заказа после оплаты

Сначала товары получаются из модели элемента карточки. Номер продукта умножается на цену продукта, и я получил модель заказа для получения общей суммы заказа

Мой товар из корзины не был перемещен в таблицу товаров заказа Как я могу их переместить?

Я получил эту ошибку ValueError на /go-to-gatewey/**

введите описание изображения здесь

ValueError at /go-to-gatewey/ Невозможно присвоить значение "2": "OrderProduct.product" должен быть экземпляром "Product". Метод запроса: GET URL запроса: 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, line 215, in set Python Executable: 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='تاریخ آپدیت ')

Какая часть неверна? Товар из моей корзины не переместился в таблицу "Заказ товара" Как я могу их переместить

Из сообщения об ошибке следует, что проблема здесь:

orderProduct.product = item.product_id

похоже, что у вас в модели OrderProduct есть что-то вроде:

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

Это означает, что вам нужно присвоить экземпляр продукта, а не instance->id

Вы можете изменить модель CartItem на

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

и затем измените вышеуказанное на

orderProduct.product = item.product

Если это не поможет вам, пожалуйста, опубликуйте ваши модели CartItem и OrderProduct

Не видя классов OrderProduct и CartItems, ответы, которые вы получите, скорее всего, будут неполными. Однако я постараюсь помочь направить вас в правильном направлении.

Проблема заключается в этой строке:

    orderProduct.product = item.product_id

Похоже, что вы настроили член OrderProduct.product как отношение к классу Product. item.product_id, однако, является целым числом.

Есть несколько возможных решений этого вопроса:

  • Возможно, вы установили поле OrderProduct.product_id или подобное ему, которое является целочисленным идентификатором для связанной таблицы. Если это так, вы можете установить для этого поля целочисленное значение item.product_id.
    • Лично я бы использовал этот подход, поскольку он предотвращает скачки данных при обработке нескольких запросов.
  • Если ваш CartItem имеет аналогичное отношение, установленное с Product, например, в CartItem.product, вы можете назначить его на OrderProduct.product вместо этого, с помощью orderProduct.product = item.product.
    • В качестве альтернативы можно запросить таблицу Product для соответствующего продукта с помощью product = Product.objects.get(id=item.product_id) или аналогичной команды. Затем можно попытаться присвоить этот объект с помощью orderPRoduct.product = product.
    • Проблема этого метода в том, что он создает гонку данных и не добавляет больше никаких гарантий. Вы можете запросить Product в одном запросе, затем другой запрос (или приложение!) может удалить Product из базы данных, затем вы попытаетесь сохранить объект orderProduct, что приведет к ошибке.
      • Точно такая же ошибка возникнет при использовании метода, который я использовал выше, как если товар не существует, так и если товар существовал при запросе и был удален. Лучше попытаться вставить, а затем проверить ошибку, чем сделать запрос, попытаться вставить, а затем все равно проверить ошибку.
Вернуться на верх