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

Спасибо

Вернуться на верх