Невозможно присвоить значение "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, что приведет к ошибке.- Точно такая же ошибка возникнет при использовании метода, который я использовал выше, как если товар не существует, так и если товар существовал при запросе и был удален. Лучше попытаться вставить, а затем проверить ошибку, чем сделать запрос, попытаться вставить, а затем все равно проверить ошибку.
- В качестве альтернативы можно запросить таблицу