Django Ecommerce View проблема с увеличением или уменьшением количества товаров с одинаковым Product Id, но разными значениями Option ID
Моя проблема, вероятно, что-то простое, но я застрял на ней. Я пытаюсь заставить мою корзину ecommerce увеличивать количество товара вверх и вниз, удаляя экземпляр, когда количество становится равным нулю. Проблема в том, что при добавлении опций к товару, который находится в другом экземпляре cart_item с тем же базовым Product_id, выдает ошибку.
Я знаю, что в один запрос get попадают разные экземпляры одного и того же product_id, но не уверен, как это решить.
MultipleObjectsReturned at /cart/add_cart/2/ get() returned more than one CartItem -- it returned 2! Request Method: GET Request URL: http://127.0.0.1:8000/cart/add_cart/2/ Django Version: 3.1 Exception Type: MultipleObjectsReturned Exception Value: get() returned more than one CartItem -- it returned 2! Exception Location: C:\Users\dave\Desktop\tnaecommerce\venv\Lib\site-packages\django\db\models\query.py, line 433, in get Python Executable: C:\Users\dave\Desktop\tnaecommerce\venv\Scripts\python.exe Python Version: 3.11.0 Python Path: ['C:\\Users\\dave\\Desktop\\tnaecommerce\\ecomwebsite\\tnaecom', 'C:\\Python311\\python311.zip', 'C:\\Python311\\DLLs', 'C:\\Python311\\Lib', 'C:\\Python311', 'C:\\Users\\dave\\Desktop\\tnaecommerce\\venv', 'C:\\Users\\dave\\Desktop\\tnaecommerce\\venv\\Lib\\site-packages'] Server time: Mon, 19 Dec 2022 16:19:11 +0000
views.py
`
`
url.py
`
from django.urls import path
from . import views
'''
/cart/ starting url from root url
'''
urlpatterns = [
path('', views.cart, name='cart'),
path('add_cart/<int:product_id>/', views.add_cart, name = 'add_cart'),
path('remove_cart/<int:product_id>/', views.remove_cart, name = 'remove_cart'),
#path('remove_cart_item/<int:product_id>/', views.remove_cart_item, name = 'remove_cart_item'),
path('remove_cart_item/<int:id>/', views.remove_cart_item, name = 'remove_cart_item')
]
`
models.py
`
`
Простите, что беспокою вас о чем-то, что, я уверен, настолько незначительно. Буду признателен за помощь.
Для решения этой проблемы я попробовал множество вариантов прямого извлечения id cart_item и добился некоторого успеха в увеличении его количества. Я просто не могу заставить числа увеличиваться и добавлять больше экземпляров.
Я уверен, что решением является некоторая вариация того, как я увеличил значение количества вниз в
remove_cart_item
`
def remove_cart_item(request, id):
cart_item = CartItem.objects.get(id=id) # get the cart item
# get the cart
try:
cart = Cart.objects.get(cart_id = _cart_id(request) ) # gets cart using private function above
except Cart.DoesNotExist:# creates a new cart instance if it doesnt exist
Cart.objects.create(
cart_id = _cart_id(request)
)
cart.save()#saves new cart if needed to be created
if cart_item.quantity > 1:
cart_item.quantity -= 1
cart_item.save()
else:
cart_item.delete() # save the cart item if there are still items left in the cart
return redirect("cart")
`
Я просто не уверен, как реализовать это в функциональности add_cart со всем остальным, что там происходит. Ошибка появляется только при попытке добавить другой товар с включенными опциями. Опция базового уровня работает нормально
используйте filter() вместо get() при выборке cart-items
в функции add-cart
.
cart_item = CartItem.objects.filter(product = product, cart = cart)
.
get() возвращает объект модели, а filter возвращает экземпляр. У вас есть одна корзина с множеством элементов в ней. Чтобы получить их, вы должны использовать filter().
Вы сталкиваетесь с ошибкой, потому что элементы корзины получают больше данных, а метод get() возвращает только один объект. В самой ошибке говорится, что MultipleObjectsReturned at /cart/add_cart/2/ get() returned more than one CartItem -- it returned 2!
. поэтому используйте метод filter()