Object of type Work is not JSON serializable

Рейтинг: 0Ответов: 0Опубликовано: 22.03.2023

Делаю сайт автосервиса на django 4.1.7. У меня есть "две корзины", которые хранятся в сессии по разным ключам. В первой корзине хранятся товары, во второй услуги. При добавлении сначала товаров, а потом услуг, никаких ошибок нет. Если добавлять сначала услуги, то вылезает ошибка введите сюда описание изображения введите сюда описание изображения

Перепробовал уже все, что нашел, ничего не помогло.Соответственно, Work - это модель. Она в принципе ничем не отличается от модели Autopart. Сама реализация корзины также одинакова, за исключением того, что услуги хранятся при количестве 1, а товары можно изменять. Также до этого была ошибка:

Object of type Decimal is not JSON serializable

я изменил тип на float для цены, вылезло это.

from _decimal import Decimal
from django.conf import settings
from work.models import Work

Реализация корзины для услуг:
class CartWork(object):

    def __init__(self, request):
        """
        Инициализируем корзину
        """
        self.session = request.session
        cart = self.session.get(settings.WORK_SESSION_ID)
        if not cart:
            # save an empty cart in the session
            cart = self.session[settings.WORK_SESSION_ID] = {}
        self.cart = cart

    def add(self, product, quantity=1, update_quantity=False):
        """
        Добавить продукт в корзину или обновить его количество.
        """
        product_id = str(product.id)
        if product_id not in self.cart:
            self.cart[product_id] = {'quantity': 0,
                                     'price': str(product.price)}
        if update_quantity:
            self.cart[product_id]['quantity'] = quantity
        else:
            self.cart[product_id]['quantity'] += quantity
        self.save()

    def save(self):
        # Обновление сессии cart
        self.session[settings.WORK_SESSION_ID] = self.cart
        # Отметить сеанс как "измененный", чтобы убедиться, что он сохранен
        self.session.modified = True

    def remove(self, work):

        product_id = str(work.id)
        if product_id in self.cart:
            del self.cart[product_id]
            self.save()

    def __iter__(self):

        product_ids = self.cart.keys()
        # получение объектов product и добавление их в корзину
        products = Work.objects.filter(id__in=product_ids)
        for product in products:
            self.cart[str(product.id)]['product'] = product
            print(type(product))
            print("Сука для товаров")

        for item in self.cart.values():
            item['price'] = Decimal(item['price'])
            item['total_price'] = item['price'] * item['quantity']
            yield item

    def __len__(self):
        """
        Подсчет всех товаров в корзине.
        """
        return sum(item['quantity'] for item in self.cart.values())

    def get_total_price(self):
        """
        Подсчет стоимости товаров в корзине.
        """
        return sum(Decimal(item['price']) * item['quantity'] for item in
                   self.cart.values())

    def clear(self):
        # удаление корзины из сессии
        del self.session[settings.WORK_SESSION_ID]
        self.session.modified = True

файл view.py

@require_POST
def cartwork_add(request, product_id):
    cartwork = CartWork(request)
    product = get_object_or_404(Work, id=product_id)
    form = CartAddWorksForm(request.POST)
    if form.is_valid():
        cd = form.cleaned_data
        cartwork.add(product=product, quantity=1)
    return redirect('work:work_list')

def cartwork_remove(request, product_id):
    cartwork = CartWork(request)
    work = get_object_or_404(Work, id=product_id)
    cartwork.remove(work)
    return redirect('cartwork:cartwork_detail')

def cartwork_detail(request):
    cartwork = CartWork(request)
    for item in cartwork:
        item['update_quantity_form'] = CartAddWorksForm(
            initial={'quantity': 1, 'update': True})
    return render(request, 'cartwork/cartWork_detail.html', {'cartwork': cartwork})

Ответы

Ответов пока нет.