TypeError: Объект типа CartItem не является JSON-сериализуемым
У меня есть класс представления, который хранит список объектов cartItem в сессии:
Вид класса:
class AddCart(View):
def post(self, *args, **kwargs):
prod_id = self.request.POST.get('prod-id')
product = Product.objects.get(pk=prod_id)
quantity = int(self.request.POST.get('quantity'))
cart = self.request.session.get('CART_ID')
if cart is None:
cart = Cart(self.request)
cartItem = CartItem(product_id=prod_id, name=product.name, quantity=quantity, image=product.image,
totalprice=float(product.price) * quantity, unitprice=product.price)
cart.update(cartItem)
print("Cart updated in View")
# del self.request.session[settings.CART_ID]
return JsonResponse({'status': 'Added to cart'})
Класс корзины выглядит следующим образом:
class Cart(object):
def __init__(self, request):
# def __init__(self):
self.session = request.session
cart_id = settings.CART_ID
cart = request.session.get(cart_id)
self.cart = cart if cart else []
# self.cart = []
def update(self, cartItem):
cartList = self.cart
print("cart list",cartList, "cartItem:",cartItem)
found = False
totalquantity = 0
for cart in cartList:
if cart.product_id == cartItem.product_id:
found = True
totalquantity = cart.quantity + cartItem.quantity
cartList.remove(cart)
if not found:
cartList.append(cartItem)
else:
newItem = CartItem(product_id=cartItem.product_id,name=cartItem.name,image=cartItem.image,quantity=totalquantity,unitprice=cartItem.unitprice,totalprice=totalquantity*cartItem.unitprice)
cartList.append(newItem)
self.cart = cartList
self.session[settings.CART_ID] = cartList
def __len__(self):
return len(self.cart)
Класс CartItem выглядит следующим образом:
class CartItem(object):
def __init__(self, product_id, name, image, quantity, unitprice, totalprice):
self.product_id = product_id
self.name = name
self.image = image
self.quantity = quantity
self.unitprice = unitprice
self.totalprice = totalprice
def __str__(self):
return f"{self.product_id}-{self.name}-{self.image}-{self.quantity}-{self.unitprice}-{self.totalprice}"
Но при вызове метода post представления AddCart возникает следующая ошибка:
Последние несколько строк трассировки стека:
Internal Server Error: /add-cart/
...
File "C:\Users\enarban\AppData\Local\Programs\Python\Python312\Lib\json\encoder.py", line 258, in iterencode
return _iterencode(o, 0)
^^^^^^^^^^^^^^^^^
File "C:\Users\enarban\AppData\Local\Programs\Python\Python312\Lib\json\encoder.py", line 180, in default
raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type CartItem is not JSON serializable
[11/Aug/2024 15:32:44] "POST /add-cart/ HTTP/1.1" 500 122549
Где находится проблема? Пожалуйста, помогите мне найти проблему.
Перед сохранением в сессию объект должен быть в формате json.
cartList.append(newItem.__dict__)
request.session[settings.CART_SESSION_ID] = cartList
request.session.modified = True
Спасибо